将字符串数组复制到字符串指针数组

时间:2020-07-15 08:43:44

标签: arrays pointers go

我正在尝试将字符串数组复制到字符串指针数组

但是在范围的结尾,我看到目标数组中的所有元素都指向源数组中的最后一个元素。

我是新来的,想正确地了解幕后发生的事情。

这是重现此问题的代码段

emails := []string{"a", "b"}
CCEmails := []*string{}
for _, cc := range emails {
    CCEmails = append(CCEmails,&cc)
}
fmt.Println(CCEmails)

https://play.golang.org/p/i6zJqoA4qAc

1 个答案:

答案 0 :(得分:0)

要了解幕后情况,您必须了解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)
        }

上面的代码遵循值语义。它复制原始切片并迭代切片内的值。在迭代时,它会复制指针处特定索引处的值。最后,指针指向迭代完成后的最后一个元素。

要获得所需的行为,请使用指针语义-

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])
    }

上面的代码遵循指针的语义。它在原始数组上循环,并将特定元素的地址附加到地址片中。

相关问题