我正在尝试将字符串数组复制到字符串指针数组中
但是在范围的末尾,我看到目标数组中的所有元素都指向源数组中的最后一个元素。
我是新来的,想正确地了解幕后发生的事情。
这是重现该问题的代码段
emails := []string{"a", "b"}
CCEmails := []*string{}
for _, cc := range emails {
CCEmails = append(CCEmails,&cc)
}
fmt.Println(CCEmails)
https://play.golang.org/p/i6zJqoA4qAc
最佳答案
要了解幕后情况,您必须了解go中for range
构造的指针和值语义。
在此ardan labs article中已明确解释
emails := []string{"a", "b"}
CCEmails := []*string{}
for _, cc := range emails {
p := &cc
fmt.Println(cc, p)
CCEmails = append(CCEmails,&cc)
}
上面的代码遵循值语义。它复制原始 slice 并迭代 slice 内的值。在迭代时,它会复制指针处特定索引处的值。最后,指针指向迭代完成后的最后一个元素。要获得所需的行为,请使用指针语义-
emails := []string{"a", "b"}
CCEmails := []*string{}
for i := range emails {
CCEmails = append(CCEmails,&emails[i])
}
fmt.Println(CCEmails)
for i := range CCEmails {
fmt.Println(CCEmails[i], *CCEmails[i])
}
上面的代码遵循指针的语义。它在原始数组上循环,并将特定元素的地址附加到地址片中。
关于arrays - 将字符串数组复制到字符串指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62910940/