2.1 创建切片
func main() { // 1.声明切片 var s1 []int if s1 == nil { fmt.Println("是空") } else { fmt.Println("不是空") } // 2.:= s2 := []int{} // 3.make() var s3 []int = make([]int, 0) fmt.Println(s1, s2, s3) // 4.初始化赋值 var s4 []int = make([]int, 0, 0) fmt.Println(s4) s5 := []int{1, 2, 3} fmt.Println(s5) // 5.从数组切片 arr := [5]int{1, 2, 3, 4, 5} var s6 []int // 前包后不包 s6 = arr[1:4] fmt.Println(s6) }
切片初始化
// 全局: var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} var slice0 []int = arr[start:end] var slice1 []int = arr[:end] var slice2 []int = arr[start:] var slice3 []int = arr[:] var slice4 = arr[:len(arr)-1] //去掉切片的最后一个元素 // 局部: arr2 := [...]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0} slice5 := arr[start:end] slice6 := arr[:end] slice7 := arr[start:] slice8 := arr[:] slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素
Reslice
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} s := arr[2:] s := arr[:] s = s[:5]
扩展 slice
s1 因为是视图,所以即使本身不存在 s1[4],但还是能取得该值
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7} fmt.Println("arr =", arr) s1 = arr[2:6] // [2 3 4 5] len(s1)=4, cap(s1)=6 s2 = s1[3:5] // [s1[3], s1[4]] 即[5 6], len(s2)=2, cap(s2)=3
但 slice 只能向后扩展,不能向前哦:s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)
那 slice 到底怎么实现的呢?
append 切片追加
添加元素时如果超越cap,系统会重新分配更大的底层数组。
由于值传递的关系,必须接收append的返回值。

