golang 案例分析
2022-02-07 09:21 天心PHP 阅读(69) 评论(0) 编辑 收藏 举报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 }