切片

和数组不同的是,切片的长度可以在运行时修改,最小为 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 函数初始化;下图给出了区别: