golang 案例分析
2022-02-07 09:21 天心PHP 阅读(73) 评论(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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现