【问题标题】:How to explain golang slice range's phenomenon [duplicate]如何解释golang切片范围的现象[重复]
【发布时间】:2018-02-20 12:01:38
【问题描述】:
type student struct {
    Name string
    Age  int
}

func main() {
    m := make(map[string]*student)
    s := []student{
        {Name: "Allen", Age: 24},
        {Name: "Tom", Age: 23},
    }

    for _, stu := range s {
        m[stu.Name] = &stu
    }
    fmt.Println(m)
    for key, value := range m {
        fmt.Println(key, value)
    }
}

结果:

地图[艾伦:0xc42006a0c0 汤姆:0xc42006a0c0]

艾伦和{汤姆 23}

汤姆和{汤姆 23}

如何解释 Slice 的现象,在我看来,stu 应该是 s 的每个成员的地址,但是从结果来看,s 的地址是一样的。

【问题讨论】:

  • stu 是一个循环变量,并且只存在一次:该变量(== 内存地址)在循环的所有迭代中都被重用。

标签: go range slice


【解决方案1】:

应用程序正在获取局部变量stu 的地址。更改代码以获取切片元素的地址:

for i := range s {
    m[s[i].Name] = &s[i]
}

https://play.golang.org/p/0izo4gGPV7

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 2018-09-28
    • 2019-06-06
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多