Go 中内置的追加函数通过创建一个新的底层数组来将元素追加到切片中,复制现有元素,并附加新元素。如果原始切片和追加函数中使用的切片共享相同的底层数组,则对任一切片所做的更改将反映在两个切片中。
考虑以下代码片段:
func someFunc(A []int) int { ... tempA := A // copy the slice by value ... newArr = remove(tempA, i) ... } func remove(slice []int, s int) []int { return append(slice[:s], slice[s+1:]...) }
这里,someFunc 函数接受一个切片 A 并创建它的一个副本,称为 tempA。然后,remove 函数对 tempA 执行追加函数,以删除索引 s 处的元素。
由于 tempA 切片最初引用与 A 相同的底层数组,因此对 tempA 所做的修改(通过追加函数)也将被删除。反映在A中。这是因为append函数创建了一个新的底层数组并将现有元素复制到其中。由于 A 和 tempA 共享相同的底层数组,因此对其中一个所做的任何更改也会传播到另一个。
由于切片的内部实现方式,这种行为在 Go 中是预期的:
要避免这种共享引用行为,您可以创建一个新切片并显式复制元素,如下所示:
tempA := make([]int, len(A)) copy(tempA, A)
以上是为什么在 Go 中附加到切片副本有时会修改原始数据?的详细内容。更多信息请关注PHP中文网其他相关文章!