主要讲解Slice 的定义、设置、复制、删除 操作
主要知识点
- Slice的定义与初始值
- 熟悉Slice append 之后 len 和 cap 的增长情况
- 手工指定 Slice 的 len 和 cap
- Slice 的 复制操作
- Slice 的删除操作(从中间、最前端、最后端 删除)
以下为代码示例:
package mainimport "fmt"//输出Slice的各项值func printSlice(s []int) { fmt.Printf("val=%v, len=%d, cap=%d\n", s, len(s), cap(s))}func sliceOps() { fmt.Println("Creating slice") var s []int // Slice 在没赋值的情况下 值为 nil for i := 0; i < 10; i++ { printSlice(s) //val=[], len=0, cap=0 //val=[1], len=1, cap=1 //val=[1 3], len=2, cap=2 //val=[1 3 5], len=3, cap=4 //val=[1 3 5 7], len=4, cap=4 //val=[1 3 5 7 9], len=5, cap=8 //val=[1 3 5 7 9 11], len=6, cap=8 //val=[1 3 5 7 9 11 13], len=7, cap=8 //val=[1 3 5 7 9 11 13 15], len=8, cap=8 //val=[1 3 5 7 9 11 13 15 17], len=9, cap=16 // 此处可以看出 随着不断增加 Slice的 len 会随着值的数量递增 // 但是 所占空间 一旦满了之后,就会执行翻倍操作 s = append(s, 2*i+1) } fmt.Println(s) //[1 3 5 7 9 11 13 15 17 19] s1 := []int{2, 4, 6, 8} printSlice(s1) //val=[2 4 6 8], len=4, cap=4 //定义一个长度为16的空Slice s2 := make([]int, 16) //定义一个长度为16,占用空间cap 为32 的Slice s3 := make([]int, 10, 32) printSlice(s2) //val=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16 printSlice(s3) //val=[0 0 0 0 0 0 0 0 0 0], len=10, cap=32 fmt.Println("Copying slice") copy(s2, s1) //将 s1 的值 复制 到 s2 中 printSlice(s2) //val=[2 4 6 8 0 0 0 0 0 0 0 0 0 0 0 0], len=16, cap=16 fmt.Println("删除掉中间的元素") s2 = append(s2[:3], s2[4:]...) //移除第三个元素 printSlice(s2) //val=[2 4 6 0 0 0 0 0 0 0 0 0 0 0 0], len=15, cap=16 fmt.Println("移除第一个元素") s2 = s2[1:] printSlice(s2) //val=[4 6 0 0 0 0 0 0 0 0 0 0 0 0], len=14, cap=15 fmt.Println("移除最后一个元素") s2 = s2[:len(s2)-1] printSlice(s2) //val=[4 6 0 0 0 0 0 0 0 0 0 0 0], len=13, cap=15}func main() { sliceOps()}