【问题标题】:Go: Taking the address of Map MembersGo:获取地图成员的地址
【发布时间】:2014-04-27 19:12:00
【问题描述】:

谁能解释为什么 r 包含两个相同地址的整数?

r := make([]*Result, len(m))
i := 0
for _, res := range m {
    fmt.Println("index, result:", i, *&res)
    r[i] = &res
    i++
}
fmt.Println(r)

结果:

index, result: 0 {[] map[0:1 1:1] {port=6379}}
index, result: 1 {[] map[0:1 1:1] {port=6380}}
[0xc21010d6c0 0xc21010d6c0]

【问题讨论】:

    标签: pointers map go


    【解决方案1】:

    res 的值在循环的每次迭代中给出。

    地址相同的事实仅意味着内存中的点被重用。

    【讨论】:

    • 嗯,有道理,你有建议重写所需的输出吗?
    • 想要的输出是什么?
    • 将map m(map[string]Result)的所有值转换为Result指针slice
    • 我认为地图不会为您提供有关这些地址有效性的任何形式的保证。因此,您可能无法获得它们。如果你要给出地址,我认为你必须提取值,你不能直接指向地图。
    • 所以我想我可以将它们直接放在中间数组中,然后遍历数组并从那里获取指针...... icky :-P
    【解决方案2】:

    使用*Result 作为地图值。例如,

    package main
    
    import "fmt"
    
    type Result struct{}
    
    func main() {
        m := make(map[string]*Result)
        r := make([]*Result, 0, len(m))
        for _, res := range m {
            fmt.Println("index, result:", len(r), *res)
            r = append(r, res)
        }
        fmt.Println(r)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多