for循环遍历结构体
看了李文周老师的博客,里面提到的一道面试题如下:
type student struct {
name string
age int
}
func main() {
m := make(map[string]*student)
stus := []student{
{name: "小王子", age: 18},
{name: "娜扎", age: 23},
{name: "大王八", age: 9000},
}
for _, stu := range stus {
// 问题在这里,遍历时,临时变量stu只初始化了一次,
// 它的指针一直没有改变过,第二次遍历时只是在在原来这块内存上重新赋值了。
// 所以下面的打印结果里面,stu值在改变,但是指针未变。
m[stu.name] = &stu
fmt.Println(m)
fmt.Printf("stu=%v %p\n", stu, &stu)
}
fmt.Println()
fmt.Println(m)
// 那么下面打印出来的,就是最后一次赋的值stu
for k, v := range m {
fmt.Println(k, "=>", v.name)
}
}
打印结果如下:
map[小王子:0xc0000040f0]
stu={小王子 18} 0xc0000040f0
map[娜扎:0xc0000040f0 小王子:0xc0000040f0]
stu={娜扎 23} 0xc0000040f0
map[大王八:0xc0000040f0 娜扎:0xc0000040f0 小王子:0xc0000040f0]
stu={大王八 9000} 0xc0000040f0
map[大王八:0xc0000040f0 娜扎:0xc0000040f0 小王子:0xc0000040f0]
小王子 => 大王八
娜扎 => 大王八
大王八 => 大王八
解决这个问题可以在for循环赋值时,将代码修改为:
for i, stu := range stus {
m[stu.name] = &stus[i]
fmt.Println(m)
fmt.Printf("stu=%v %p\n", stu, &stu[i])
}