其他分享
首页 > 其他分享> > golang 案例分析

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