【发布时间】:2021-09-03 15:39:25
【问题描述】:
我有这个代码:
// The input param is A := []int{3, 4, 5, 3, 7}
func someFunc(A []int) int {
...
ways := 0
i := 0
for i < len(A) {
if i+1 == len(A) || i == len(A) {
fmt.Println("break")
break
}
tempA := A // copy the slice by value
fmt.Println("A: ", A)
fmt.Println("tempA: ", A)
fmt.Println()
newArr = remove(tempA, i)
if isAesthetic(newArr) {
ways++
}
i++
}
...
}
func remove(slice []int, s int) []int {
return append(slice[:s], slice[s+1:]...)
}
Cosole 输出:
A: [3 4 5 3 7]
tempA: [3 4 5 3 7]
A: [4 5 3 7 7]
tempA: [4 5 3 7 7]
A: [4 3 7 7 7]
tempA: [4 3 7 7 7]
A: [4 3 7 7 7]
tempA: [4 3 7 7 7]
变量A 也发生了变化,而我只是将其按值复制到tempA 中。而且还是append()函数,为什么之前附加tempA的切片也变了?
【问题讨论】:
-
tempA := A不按值复制切片;它使tempA指向与A相同的内容,所以修改tempA的内容也会修改A -
@EliBendersky 这个geeksforgeeks.org/… 参考是一个骗局。那么如何让它按值复制呢?所以
A在tempA改变时不会改变。 -
切片是数组的视图。切片不是数组。分配数组会复制数组。分配切片会复制切片头而不是其内容。
-
@alramdein 请参阅slice tricks 中的复制部分。
-
Go 中的所有数据类型都有一个静态大小。如果它没有恒定数量的元素,则它不是数组。切片也是静态大小的,因为真实数据没有存储在值“内部”(因此是您的问题)。