gpt4 book ai didi

arrays - 在 Go 中将数组复制到 slice

转载 作者:行者123 更新时间:2023-12-02 06:35:54 25 4
gpt4 key购买 nike

请您帮助我了解如何从数组生成 slice 的工作原理。为什么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)

[[a b] [c d]]

id1 = [[c d] [c d]]
id2 = [[a b] [c d]]

最佳答案

因为 for range 循环有一个迭代变量,该变量在每次迭代中重复使用。 Spec: For statements: For statements with for clause

Variables declared by the init statement are re-used in each iteration.

所以在你的第一个循环中:

for _, t := range z {
temp := t[:]
id = append(id, temp)
}

有一个 t,并且您对同一个 t 数组进行 slice ,因此您附加的每个 temp slice 都会指向相同的后备数组,即 t,并且在每次迭代中都会被覆盖,因此其值将是最后一次迭代的值:[c d]

在第二个循环中:

for _, t := range z {
temp := t
id2 = append(id2, temp[:])
}

还有一个 t 迭代变量,但您复制了它:temp := t,然后对该副本进行 slice ,该副本与 t,然后附加一个 slice ,该 slice 将副本作为其支持数组,该数组在每次迭代中都不会被覆盖。

关于arrays - 在 Go 中将数组复制到 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60402382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com