月关宝盒
我认为切片包含对底层数组的引用。不是这样吗?是的。但是您使用以下语句创建了一个长度为 3 的数组:s := []int{1, 2, 3}当您将元素附加到ss时,需要分配一个新的更长的数组。因此,您失去了与此声明之间的ss联系s:ss = append(ss, 4)您可以通过运行以下示例来验证这一点:package mainimport ( "fmt")func main() { s := []int{1, 2, 3} ss := s[1:] ss[0] += 5 ss = append(ss, 4) ss[0] += 100 fmt.Println(s)}哪个打印[1 7 3]。如果您将初始化的s长度更改为大于三,则不需要新的数组分配,s并且ss将保持 和 之间的链接:package mainimport ( "fmt")func main() { s := make([]int, 3, 4) s[0], s[1], s[2] = 1, 2, 3 ss := s[1:] ss[0] += 5 ss = append(ss, 4) ss[0] += 100 fmt.Println(s)}输出:[1 107 3]理论上认为问题是切片的范围副本的答案是不正确的,可以通过以下示例显示:package main import ( "fmt" ) func main() { s := make([]int, 3, 4) s[0], s[1], s[2] = 1, 2, 3 ss := s[1:] ss = append(ss, 4) for i := range ss { ss[i] += 10 } fmt.Println(s) } 输出:[1 12 13]