在 Go 中将数组复制到切片

Vis*_*hal 3 arrays go 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)
Run Code Online (Sandbox Code Playgroud)

[[A B C D]]

id1 = [[cd] [cd]]
id2 = [[ab] [cd]]

icz*_*cza 5

因为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的副本进行切片,然后附加一个切片,该切片将副本作为其后备数组,在每次迭代中都不会被覆盖.