Go中for range的时候,地址是否发生变化

发布时间 2023-12-07 16:37:52作者: 若-飞

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