golang 案例分析
package main
import (
"fmt"
)
type student struct {
Name string
Age int
}
func main() {
//定义map
m := make(map[string]*student)
//定义student数组
stus := []student{
{Name: "zhou", Age: 24},
{Name: "li", Age: 23},
{Name: "wang", Age: 22},
}
//将数组依次添加到map中
for _, stu := range stus {
fmt.Printf("%v\t%p\n",stu,&stu)
m[stu.Name] = &stu
}
//打印map
for k,v := range m {
fmt.Println(k ,"=>", v.Name)
}
}
结果:
{zhou 24} 0xc000004480
{li 23} 0xc000004480
{wang 22} 0xc000004480
zhou => wang
li => wang
wang => wang
通过上面的案例,我们不难发现stu变量的地址始终保持不变,每次遍历仅进行struct值拷贝,故m[stu.Name]=&stu实际上一直指向同一个地址,最终该地址的值为遍历的最后一个struct的值拷贝。
修正方案,取数组中原始值的地址:
for i, _ := range stus {
stu:=stus[i]
m[stu.Name] = &stu
}