package main
import "fmt"
func main() {
diySlice := make([]int, 0, 2)
diySlice = append(diySlice, 8)
//观察diySlice3
diySlice3 := append(diySlice, 1)
//diySlice 变化
//查看输出切片的变化,为什么和直接输出结果不一样
fmt.Println("diySlice内容下标", diySlice[0:2])
//查看输出切片的变化
fmt.Println("diySlice 内容", diySlice)
//查看长度和容量
fmt.Printf("diySlice-->容量%d 长度%d\n", cap(diySlice), len(diySlice))
fmt.Println("diySlice3 内容", diySlice3)
fmt.Printf("diySlice3-->容量%d 长度%d\n", cap(diySlice3), len(diySlice3))
//观察diySlice2
diySlice2 := append(diySlice, 1, 2)
fmt.Println("diySlice2 内容", diySlice2)
fmt.Printf("diySlice2-->容量%d 长度%d\n", cap(diySlice2), len(diySlice2))
}
输出结果为:
1.第一部分
diySlice3与diySlice共享同一个底层数组,而且即使切片的长度小于其容量,仍然可以访问底层数组中超出切片长度范围的元素,此时底层数组的元素为8和1,所以diySlice[0:2]的结果为8和1。虽然 diySlice3与diySlice底层数组是共享的,但是它俩的地址并不是一样的,因此直接输出diySlice时结果为8。diySlice的容量在make时已经定义为2,长度为切片中元素的个数即为1。
2.第二部分
diySlice3是通过append内置函数创建的,包含diySlice中的元素和1,同时与diySlice共享同一个底层数组,所以它的值为8和1,长度为2,容量也为2。
3.第三部分
diySlice2通过append函数,包含diySlice的元素并追加1和2,但是diySlice容量为2,diySlice2中的元素已经超出容量,触发切片的扩容。另外开辟一个新的底层数组,将diySlice2的元素迁移过去,此时diySlice2和diySlice不再共享同一个底层数组,修改diySlice2中的值不会影响diySlice的值。