【发布时间】:2017-10-24 18:48:35
【问题描述】:
我今天在 go 代码中遇到了奇怪的行为:当我在循环中将 elements 附加到 slice 然后尝试根据循环结果创建新的 slices 时,最后一个 append 覆盖 slices 来自以前的appends。
在这个特定示例中,这意味着 sliceFromLoop j,g 和 h 切片的最后一个元素分别不是 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 复制到新值来解决,但是看起来很正常。 ..犹豫不决。
什么是基于旧切片创建许多新切片而不担心更改旧切片的值的惯用方式?
【问题讨论】:
标签: go