切片
和数组不同的是,切片的长度可以在运行时修改,最小为 0 最大为相关数组的长度:切片是一个长度可变的数组
cap()
可以测量切片最长可以达到多少:0 <= len(s) <= cap(s)
注意 绝对不要用指针指向 slice。 切片本身已经是一个引用类型,所以它本身就是一个指针!!
-
var slice1 []type = arr1[:]
那么 slice1 就等于完整的 arr1 数组(arr1[0:len(arr1)]
的缩写) -
arr1[2:]
和arr1[2:len(arr1)]
相同,都包含了数组从第二个到最后的所有元素 -
arr1[:3]
和arr1[0:3]
相同,包含了从第一个到第三个元素(不包括第三个)。 -
slice1 = slice1[:len(slice1)-1]
去掉最后一个元素 -
var x = []int{2, 3, 5, 7, 11}
这样就创建了一个长度为 5 的数组并且创建了一个相关切片
一个切片 s 可以这样扩展到它的大小上限: s = s[:cap(s)]
,如果再扩大的话就会导致运行时错误
用 make() 创建切片
var slice1 []type = make([]type, len)
new() 和 make() 的区别
- new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体(参见第 10 章);它相当于
&T{}
。 - make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、 map 和 channel(参见第 8 章,第 13 章)
换言之,new 函数分配内存,make 函数初始化;下图给出了区别: