Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将数组复制到Go中的切片_Arrays_Go_Slice - Fatal编程技术网

Arrays 将数组复制到Go中的切片

Arrays 将数组复制到Go中的切片,arrays,go,slice,Arrays,Go,Slice,请您帮助我了解如何从数组生成切片。为什么ID1和ID2不一样 a:=[2]字符串{“a”,“b”} b:=[2]字符串{“c”,“d”} var z[2][2]字符串 z[0]=a z[1]=b fmt.Printf(“%s\n”,z) 变量id[][]字符串 对于u,t:=范围z{ 温度:=t[:] id=附加(id,临时) } fmt.Printf(“\nid1=%s”,id) 变量id2[][]字符串 对于u,t:=范围z{ 温度:=t id2=追加(id2,临时[:]) } fmt.Pr

请您帮助我了解如何从数组生成切片。为什么ID1和ID2不一样

a:=[2]字符串{“a”,“b”}
b:=[2]字符串{“c”,“d”}
var z[2][2]字符串
z[0]=a
z[1]=b
fmt.Printf(“%s\n”,z)
变量id[][]字符串
对于u,t:=范围z{
温度:=t[:]
id=附加(id,临时)
}
fmt.Printf(“\nid1=%s”,id)
变量id2[][]字符串
对于u,t:=范围z{
温度:=t
id2=追加(id2,临时[:])
}
fmt.Printf(“\nid2=%s”,id2)
[a b][c d]]

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


因为
for range
循环有一个迭代变量,在每次迭代中都会重用该变量

init语句声明的变量在每次迭代中都会重复使用

因此,在您的第一个循环中:

for _, t := range z {
    temp := t[:]
    id = append(id, temp)
}
有一个单独的
t
,并且您对相同的
t
数组进行切片,因此您附加的每个
temp
切片都将指向相同的支持数组,即
t
,并且它在每次迭代中都会被覆盖,因此它的值将是最后一次迭代的值:
[cd]

在第二个循环中:

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

还有一个
t
迭代变量,但您要复制它:
temp:=t
,然后切片这个副本,它与
t
分离,然后添加一个切片,该切片将副本作为其支持数组,在每次迭代中不会被覆盖。

这是一个有问题的赋值。这并不是看起来的那样:

temp := t[:]

这里,
t
是一个数组和循环变量。这意味着在每次迭代中,当前数组的内容都会复制到
t
。在第一次迭代中,
t=[]字符串{“a”,“b”}
,创建一个切片以指向该数组并分配给
temp
。在第二次迭代时,
t
被覆盖为
[]字符串{“c”,“d”}
。此操作还会覆盖第一个切片的内容。所以,您以
{{“c”,“d”},{“c”,“d”}
结束。这里重要的一点是,
t
的内容被覆盖,
t
在两个片之间共享。

在第一个循环中,您保存的片具有相同的后备数组(即循环变量
t
)。在第二个循环中,您使用不同的备份阵列存储切片,因为您在
temp

中复制了Rob Pike的
t
,这提供了一个有用的背景。