func main(){
s := []int{5}
s = append(s,7)
s = append(s,9)
x := append(s,11)
y := append(s,12)
fmt.Prinln(s,x,y)
}
输出的结果是 [5,7,9] [5,7,9,12] [5,7,9,12]
x和y 的值竟然一样了
把代码变一下
func main(){
s := []int{5,7,9}
x := append(s,11)
y := append(s,12)
fmt.Prinln(s,x,y)
}
输出的结果 [5,7,9] [5,7,9,11] [5,7,9,12]
为什么会造成这样的结果呢,这个要从go 的 slice 原理说起
第一种情况:
1.创建 s时 cap1 len1 内存中数据为[5] s指针假设为p1
2.append(s,7) 按slice扩容机制 cps(s) 翻倍 cps=2 新建一个新的底层数组 此时 s指针指向新的数组 p2 底层数组元素 [5,7]
3,appen(s,9) 按slice扩容机制 cps(s)翻倍 cps=4 新建一个新的底层数组 将s指向的数组 复制到newarr 然后将 9 加到newarr 此时 s指向新数组 p3 数组元素为[5,7,9]
4,x:= append(s,11) 此时 容量足够不需要扩容 底层数组数据为[5,7,9,11] 此时 x 和 s 共同指向这个底层数组 p3
5,y := append(s,12) 此时cps(s)=4 容量足够不需要扩容 底层数组 第四个元素 用12 覆盖之前的11 s和y共同指向这个底层数组 数组元素为[5,7,9,12]
所以 s, x, y 都指向了同一个内存地址
第二种情况:
1,s := []int{5,7,9} cap(s) = 3
2, x := append(s,11) 需要扩容 新建一个底层数组 x指向这个内存地址
3, y := append(s,12) 需要扩容 昔年一个底层数组 y指向这个内存地址
所以 x,y 指向不同的数组 自然 值也就不一样了