我正在尝试将字符串数组复制到字符串指针数组
但是在范围的结尾,我看到目标数组中的所有元素都指向源数组中的最后一个元素。
我是新来的,想正确地了解幕后发生的事情。
这是重现此问题的代码段
emails := []string{"a", "b"}
CCEmails := []*string{}
for _, cc := range emails {
CCEmails = append(CCEmails,&cc)
}
fmt.Println(CCEmails)
答案 0 :(得分:0)
要了解幕后情况,您必须了解go中for range
构造的指针和值语义。
emails := []string{"a", "b"}
CCEmails := []*string{}
for _, cc := range emails {
p := &cc
fmt.Println(cc, p)
CCEmails = append(CCEmails,&cc)
}
上面的代码遵循值语义。它复制原始切片并迭代切片内的值。在迭代时,它会复制指针处特定索引处的值。最后,指针指向迭代完成后的最后一个元素。
要获得所需的行为,请使用指针语义-
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])
}
上面的代码遵循指针的语义。它在原始数组上循环,并将特定元素的地址附加到地址片中。