请您帮我了解如何从数组生成切片。为什么 ID1 和 ID2 不一样?
a := [2]string{"a", "b"}
b := [2]string{"c", "d"}
var z [2][2]string
z[0] = a
z[1] = b
fmt.Printf("%s\n", z)
var id [][]string
for _, t := range z {
temp := t[:]
id = append(id, temp)
}
fmt.Printf("\nid1 = %s", id)
var id2 [][]string
for _, t := range z {
temp := t
id2 = append(id2, temp[:])
}
fmt.Printf("\nid2 = %s", id2)
Run Code Online (Sandbox Code Playgroud)
[[A B C D]]
id1 = [[cd] [cd]]
id2 = [[ab] [cd]]
因为for range循环有一个迭代变量,每次迭代都会重用它。规范:For 语句:For 语句与 for 子句
init 语句声明的变量在每次迭代中都会重新使用。
所以在你的第一个循环中:
for _, t := range z {
temp := t[:]
id = append(id, temp)
}
Run Code Online (Sandbox Code Playgroud)
有一个t, 并且您对同一个t数组进行切片,因此temp您附加的每个切片都将指向同一个后备数组,即t,并且在每次迭代中都会被覆盖,因此其值将是最后一次迭代的值:[c d].
在你的第二个循环中:
for _, t := range z {
temp := t
id2 = append(id2, temp[:])
}
Run Code Online (Sandbox Code Playgroud)
还有一个t迭代变量,但是您制作了它的副本:temp := t,然后对与 分离t的副本进行切片,然后附加一个切片,该切片将副本作为其后备数组,在每次迭代中都不会被覆盖.