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 }
标签:分析,stus,wang,stu,golang,案例,map,student,Name 来源: https://www.cnblogs.com/xiangshihua/p/15866942.html