使用值类型时,修改副本需重新赋值回map才能更新原始数据;2. 使用指针类型可直接通过解引用修改原数据,无需重新赋值;3. 建议大结构体或频繁修改场景用指针,注意nil和并发安全问题。

在 Go 语言中,使用指针类型和值类型作为 map 的元素时,在更新操作上会有显著差异。理解这些差异对正确修改 map 中的数据非常重要。
值类型:更新不会反映到原始数据
当 map 的值是基本类型或结构体等值类型时,通过 map[key] 获取的是该值的一个副本。直接修改这个副本并不会影响 map 中存储的原始值。
例如:
<span>type</span> Person <span>struct</span> {<br> Name <span>string</span><br> Age <span>int</span><br>}<br><br>m := <span>map</span>[<span>string</span>]Person{<br> <span>"alice"</span>: {Name: <span>"Alice"</span>, Age: 30},<br>}<br><br>p := m[<span>"alice"</span>]<br>p.Age = 31<br>fmt.Println(m[<span>"alice"</span>].Age) <span>// 输出 30,未改变</span>
要真正更新值类型字段,必须重新赋值回 map:
立即学习“go语言免费学习笔记(深入)”;
p := m[<span>"alice"</span>]<br>p.Age = 31<br>m[<span>"alice"</span>] = p <span>// 写回 map</span><br>fmt.Println(m[<span>"alice"</span>].Age) <span>// 输出 31</span>
指针类型:可直接修改原数据
如果 map 的值是指向结构体的指针,那么通过 key 取出的是指针副本,但它仍指向同一个结构体实例。因此可以直接通过解引用修改原始数据。
文心大模型
56
百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作
56
查看详情
示例:
m := <span>map</span>[<span>string</span>]*Person{<br> <span>"alice"</span>: &Person{Name: <span>"Alice"</span>, Age: 30},<br>}<br><br>p := m[<span>"alice"</span>]<br>p.Age = 31 <span>// 直接修改原对象</span><br>fmt.Println(m[<span>"alice"</span>].Age) <span>// 输出 31</span>
这里不需要重新赋值,因为修改的是指针所指向的内存内容。
常见场景与建议
处理结构体较大的情况时,推荐使用指针类型存入 map,避免频繁拷贝。同时能更方便地进行字段更新。
- 值类型适合小型、不可变或无需修改的结构
- 指针类型更适合需要频繁修改字段的场景
- 注意 nil 指针风险:确保 map 中的指针非 nil 再访问其字段
- 并发环境下,即使使用指针,也需额外同步机制保护数据安全
基本上就这些。关键点在于搞清楚你拿到的是“副本”还是“通往原数据的通道”。用好指针可以简化更新逻辑,但也带来额外责任。
相关标签:
go golang 同步机制 golang指针 golang 结构体 指针 值类型 指针类型 nil map 并发
大家都在看:
Go语言中从通道获取值的正确姿势:避免阻塞与无限循环
使用 Go 语言写入文件:高效处理数值数组
使用 Go 语言与 Gitolite 集成
使用 Go 语言和 Gitolite
Go语言中select语句避免阻塞的正确姿势
使用 Go 语言写入文件:高效处理数值数组
使用 Go 语言与 Gitolite 集成
使用 Go 语言和 Gitolite
Go语言中select语句避免阻塞的正确姿势
本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END






























暂无评论内容