Go中for range的时候,地址是否发生变化
1,回答问题之前,先看下面这段代码
package main
import "fmt"
type girl struct {
Name string
Age int
}
func main() {
gl := make(map[string]*girl)
studs := []girl{
{Name: "Lili", Age: 23},
{Name: "Lucy", Age: 24},
{Name: "Han Mei", Age: 21},
}
for _, v := range studs {
gl[v.Name] = &v
}
for mk, mv := range gl {
fmt.Println(mk, "=>", mv.Age)
}
}
2,编译的结果
Lili => 21
Lucy => 21
Han Mei => 21
3,分析原因
从结果可得知,for range的时候,地址并没有发生变化。在循环时,会创建一个变量,每次都会把地址赋给同一个变量,导致循环结束后,拷贝的是最后一个。请看下图:
for _, v := range studs {
gl[v.Name] = &v
fmt.Printf("%s addr: %v\n", v.Name, &v.Age)
}
Lili addr: 0xc0000a4028
Lucy addr: 0xc0000a4028
Han Mei addr: 0xc0000a4028
4,解决问题
在每次循环时,创建一个临时变量,请看下图
for _, v := range studs {
temp := v
gl[v.Name] = &temp
}
Lili => 23
Lucy => 24
Han Mei => 21
5,总结
go中for range的时候,地址没有发生变化
————————————————
版权声明:本文为CSDN博主「会飞的code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guzimou2/article/details/123289117