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

标签 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

最佳答案

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

相关文章:

java - 计算数组java中的出现次数

python - 输出为数组或方括号时的区别

java - 交换排序算法查询

c - 如何创建指向二维数组的指针数组

docker - Slackware 14.2 中的 runc 安装错误

go - 这是在 Go 中做什么,看起来像类型转换

go - 如何干净地处理结构状态的错误?

php - 需要帮助在 mySQL 中存储动态列表

c++ - 比较 operator== 中的对象指针

c - 如何理解指针 (*) 和寻址 (&) 运算符的概念?