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)拷贝到一个切片,再对切片排序