我今天在 go 代码中遇到了奇怪的行为:当我附加elements到slicein 循环然后尝试slices根据循环的结果创建新的时,最后一次append覆盖slices来自 previous appends。
在这个特定的例子中,这意味着sliceFromLoop j,g和hslice 的最后一个元素分别不是100,101和102,但是......总是102!
第二个例子 -sliceFromLiteral表现如预期。
package main
import "fmt"
func create(iterations int) []int {
a := make([]int, 0)
for i := 0; i < iterations; i++ {
a = append(a, i)
}
return a
}
func main() {
sliceFromLoop()
sliceFromLiteral()
}
func sliceFromLoop() {
fmt.Printf("** NOT working as expected: **\n\n")
i := create(11)
fmt.Println("initial slice: ", i)
j := append(i, 100)
g := append(i, 101)
h := append(i, 102)
fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h)
}
func sliceFromLiteral() {
fmt.Printf("\n\n** working as expected: **\n")
i := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
fmt.Println("initial slice: ", i)
j := append(i, 100)
g := append(i, 101)
h := append(i, 102)
fmt.Printf("i: %v\nj: %v\ng: %v\nh:%v\n", i, j, g, h)
}
play.golang 链接:https : //play.golang.org/p/INADVS3Ats
经过一些阅读、挖掘和试验,我发现这个问题源于slices引用相同的底层array 值,可以通过slice在追加任何内容之前复制到新值来解决,但它看起来很......犹豫不决。
基于旧切片创建许多新切片而不用担心更改旧切片的值的惯用方法是什么?
largeQ
慕哥9229398
RISEBY
相关分类