6.go 数组

1.数组声明
	var identifier [len]type
	var arr1 [5]int

	//Go 语言中的数组是一种 值类型(不像 C/C++ 中是指向首元素的指针),所以可以通过 new() 来创建: 
	var arr1 = new([5]int)

2.数组常量
	如果数组值已经提前知道了,那么可以通过 数组常量 的方法来初始化数组
	var arrAge = [5]int{18, 20, 15, 22, 16}
	var arrLazy = [...]int{5, 6, 7, 8, 22}
	var arrLazy = []int{5, 6, 7, 8, 22}
	arrKeyValue = [5]string{3: "Chris", 4: "Ron"}
	var arrKeyValue = []string{3: "Chris", 4: "Ron"}

3.切片
	和数组不同的是,切片的长度可以在运行时修改,切片是一个长度可变的数组,切片的长度永远不会超过它的容量.
	多个切片如果表示同一个数组的片段,它们可以共享数据;因此一个切片和相关数组的其他切片是共享存储的,
  相反,不同的数组总是代表不同的存储。数组实际上是切片的构建块.

  	优点 因为切片是引用,所以它们不需要使用额外的内存并且比使用数组更有效率,所以在 Go 代码中 切片比数组更常用。

  	声明切片的格式是: var identifier []type(不需要说明长度)。
  	var slice1 []type = arr1[:] 那么 slice1 就等于完整的 arr1 数组,所以这种表示方式是 arr1[0:len(arr1)] 的一种缩写)。
  另外一种表述方式是:slice1 = &arr1。
    arr1[2:] 和 arr1[2:len(arr1)] 相同,都包含了数组从第三个到最后的所有元素。
    arr1[:3] 和 arr1[0:3] 相同,包含了从第一个到第三个元素(不包括第三个)。

    用 make() 创建一个切片 :
    var slice1 []type = make([]type, len) // 也可以简写为 slice1 := make([]type, len)
    如果你想创建一个 slice1,它不占用整个数组,而只是占用以 len 为个数个项,那么只要 : slice1 := make([]type, len, cap)

    切片重组(reslice):
    sl = sl[0:len(sl)+1]

    切片的复制与追加:
    copy();
    append();


4.new() 和 make() 的区别
	看起来二者没有什么区别,都在堆上分配内存,但是它们的行为不同,适用于不同的类型。
	1.new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,
      值为 0 的地址的指针,它适用于值类型如数组和结构体(参见第 10 章);它相当于 &T{}。
    2.make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel(参见第 8 章,第 13 章)。
    换言之,new 函数分配内存,make 函数初始化;


https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.6.md



1.map 类型
	map 是引用类型,可以使用如下声明:
	var map1 map[keytype]valuetype
	var map1 map[string]int
	不要使用 new,永远用 make 来构造 map
	make(map[keytype]valuetype, cap)

	_, ok := map1[key1] // 如果key1存在则ok == true,否则ok为false

	delete(map1, key1) // 删除

	map 类型的切片:
	假设我们想获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配 切片中每个 map 元素
	items := make([]map[int]int, 5)
	for i:= range items {
		items[i] = make(map[int]int, 1)
		items[i][1] = 2
	}


	map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序
	如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序


猜你喜欢

转载自blog.csdn.net/enlyhua/article/details/82320567