慕容3067478
切片只是数组一部分的窗口,它没有特定的存储空间。这意味着如果在数组的同一部分有两个切片,则两个切片必须“包含”相同的值。这正是这里发生的事情:当您执行第一个操作时append,您将在一个大小2为基础的数组上获得一个新的大小切片2。当您执行 next 时append,您将获得一个新的大小切片,3但底层数组的大小4(append通常分配的空间比立即需要的空间多,因此不需要在每次追加时分配)。这意味着 nextappend不需要新数组。因此x,y两者都将使用与先例 slice 相同的底层数组s。你写11然后12在这个数组的同一个槽中,即使你得到两个不同的切片(记住,它们只是窗口)。您可以通过在每次 append 后打印切片的容量来检查:fmt.Println(cap(s))如果你想在xand 中有不同的值y,你应该做一个副本,例如这样:s := []int{5}s = append(s, 7)s = append(s, 9)x := make([]int,len(s))copy(x,s)x = append(x, 11)y := append(s, 12)fmt.Println(s, x, y)这里的另一个解决方案可能是强制s切片后面的数组的容量不大于所需的容量(从而确保以下两个append 必须使用新数组):s := []int{5}s = append(s, 7)s = append(s, 9)s = s[0:len(s):len(s)]x := append(s, 11)y := append(s, 12)fmt.Println(s, x, y)