【问题标题】:Why must I copy string before dereferencing?为什么我必须在取消引用之前复制字符串?
【发布时间】:2020-09-03 05:02:38
【问题描述】:

要将值是字符串的映射转换为值指向字符串的映射,我需要先复制字符串。如果我不这样做,所有的值都是相同的,可能是错误的值。为什么是这样?我这里没有取字符串文字的地址。

func mapConvert (m map[string]string) map[string]*string {
    ret := make(map[string]*string)

    for k, v := range m {
        v2 := v[:]
        ret[k] = &v2
        // With the following instead of the last 2 lines, 
        // the returned map have the same, sometimes wrong value for all keys.
        // ret[k]=&v 
    }
    return ret
}

【问题讨论】:

    标签: pointers go


    【解决方案1】:

    函数mapConvert 中有一个变量v。应用程序将这个单一变量的地址用于映射中的每个键。

    通过为循环的每次迭代创建一个新变量来修复。使用映射中变量的地址。

    func mapConvert (m map[string]string) map[string]*string {
        ret := make(map[string]*string)
    
        for k, v := range m {
            v := v  // create a new 'v'.
            ret[k] = &v
        }
        return ret
    }
    

    请参阅https://golang.org/doc/faq#closures_and_goroutines 以了解在并发上下文中对同一问题的解释。

    【讨论】:

    • 我编辑了我的问题以包含替代代码。
    猜你喜欢
    • 2015-05-29
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2011-08-29
    • 2019-11-26
    • 2019-08-13
    相关资源
    最近更新 更多