在阅读 Go 切片时,我在方法的上下文中遇到了这种append
行为
如果 s 的后备数组太小而无法容纳所有给定值,则会分配一个更大的数组。返回的切片将指向新分配的数组。
为了理解这一点,我编写了以下代码:
func makeSlices() {
var a []int;
a = append(a, 0)
b := append(a, 1)
printSlice("b", b)
c := append(a, 2)
printSlice("b", b)
printSlice("c", c)
}
func printSlice(name string, s []int) {
fmt.Printf("var=%v len=%d cap=%d first_address=%v %v\n", name, len(s), cap(s), &s[0], s)
}
输出:
var=b len=2 cap=2 first_address=0x414020 [0 1]
var=b len=2 cap=2 first_address=0x414020 [0 2]
var=c len=2 cap=2 first_address=0x414020 [0 2]
我希望b并c指向相同的底层数组,因为它们都是相同长度的切片
但是如果我要为另一个长度的切片改变相同的代码:
在 Go Playground 上试用
func makeSlices() {
var a []int;
a = append(a, 0, 9)
d := append(a, 1, 2)
printSlice("d", d)
e := append(a, 3, 4)
printSlice("d", d)
printSlice("e", e)
}
输出:
var=d len=5 cap=8 first_address=0x450020 [0 0 9 1 2]
var=d len=5 cap=8 first_address=0x450020 [0 0 9 1 2]
var=e len=5 cap=8 first_address=0x450040 [0 0 9 3 4]
在这种情况下,d和e应该指向相同的后备数组,因为它们又是相同长度的切片,但它们不是。
为什么会出现这种行为异常?Go 到底什么时候决定为切片分配一个新的支持数组?
qq_花开花谢_0
慕沐林林
相关分类