anotherSlice := theSlice
anotherSlice = append(anotherSlice, newEle)
fmt.Println(len(anotherSlice) == len(theSlice))
该代码片段将输出
false
。为什么?这是其他一些实验:
package main
import "fmt"
func main() {
theSlice := []int{3,3,2,5,12,43}
anotherSlice := theSlice
fmt.Println(anotherSlice[3], theSlice[3])
anotherSlice[3] = anotherSlice[3]+2
fmt.Println(anotherSlice[3], theSlice[3])
anotherSlice = append(anotherSlice[:3], anotherSlice[4:]...)
fmt.Println(len(anotherSlice),len(theSlice))
}
输出如下:
5 5
7 7
5 6
Program exited.
最佳答案
每当附加的 slice anotherSlice
没有新元素的容量时,append
函数就会创建新的 slice 并返回它。从那时起,片段anotherSlice
和theSlice
不同-它们由单独的数组支持。
以较短的anotherSlice[:3]
长度对 slice 进行 slice 不会影响 slice 的原始容量。
下一行:
anotherSlice = append(anotherSlice[:3], anotherSlice[4:]...)
删除第四个(索引3)元素。由于
anotherSlice[:3]
具有保存anotherSlice[4:]
的所有元素的能力,因此不会发生新分配,因此将修改两个片。package main
import (
"fmt"
)
func main() {
x := []int{1, 2, 3, 4, 5, 6}
fmt.Println(cap(x[:3]) >= len(x[:3])+len(x[4:]))
y := append(x[:3], x[4:]...)
fmt.Println(x, y)
}
关于go - 将引用类型为 “slice”的变量分配给另一个变量,为什么它们不同时更改?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36890875/