主要讲解Slice 的定义、设置、复制、删除 操作
主要知识点
- Slice的定义与初始值
- 熟悉Slice append 之后 len 和 cap 的增长情况
- 手工指定 Slice 的 len 和 cap
- Slice 的 复制操作
- Slice 的删除操作(从中间、最前端、最后端 删除)
以下为代码示例:
package main
import "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()
}