您的位置 首页 编程知识

golang指针与值类型在map更新时的不同

使用值类型时,修改副本需重新赋值回map才能更新原始数据;2. 使用指针类型可直接通过解引用修改原数据,无需重…


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

golang指针与值类型在map更新时的不同

在 Go 语言中,使用指针类型和值类型作为 map 的元素时,在更新操作上会有显著差异。理解这些差异对正确修改 map 中的数据非常重要。

值类型:更新不会反映到原始数据

当 map 的值是基本类型或结构体等值类型时,通过 map[key] 获取的是该值的一个副本。直接修改这个副本并不会影响 map 中存储的原始值。

例如:

<span style="color:#000080;font-weight:bold">type</span> Person <span style="color:#000080;font-weight:bold">struct</span> {<br>    Name <span style="color:#000080;font-weight:bold">string</span><br>    Age  <span style="color:#000080;font-weight:bold">int</span><br>}<br><br>m := <span style="color:#000080;font-weight:bold">map</span>[<span style="color:#000080;font-weight:bold">string</span>]Person{<br>    <span style="color:#A31515">"alice"</span>: {Name: <span style="color:#A31515">"Alice"</span>, Age: 30},<br>}<br><br>p := m[<span style="color:#A31515">"alice"</span>]<br>p.Age = 31<br>fmt.Println(m[<span style="color:#A31515">"alice"</span>].Age) <span style="color:#2B91AF">// 输出 30,未改变</span>
登录后复制

要真正更新值类型字段,必须重新赋值回 map:

立即学习“”;

p := m[<span style="color:#A31515">"alice"</span>]<br>p.Age = 31<br>m[<span style="color:#A31515">"alice"</span>] = p <span style="color:#2B91AF">// 写回 map</span><br>fmt.Println(m[<span style="color:#A31515">"alice"</span>].Age) <span style="color:#2B91AF">// 输出 31</span>
登录后复制

指针类型:可直接修改原数据

如果 map 的值是指向结构体的指针,那么通过 key 取出的是指针副本,但它仍指向同一个结构体实例。因此可以直接通过解引用修改原始数据。

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

golang指针与值类型在map更新时的不同56

示例:

m := <span style="color:#000080;font-weight:bold">map</span>[<span style="color:#000080;font-weight:bold">string</span>]*Person{<br>    <span style="color:#A31515">"alice"</span>: &Person{Name: <span style="color:#A31515">"Alice"</span>, Age: 30},<br>}<br><br>p := m[<span style="color:#A31515">"alice"</span>]<br>p.Age = 31 <span style="color:#2B91AF">// 直接修改原对象</span><br>fmt.Println(m[<span style="color:#A31515">"alice"</span>].Age) <span style="color:#2B91AF">// 输出 31</span>
登录后复制

这里不需要重新赋值,因为修改的是指针所指向的内存内容。

常见场景与建议

处理结构体较大的情况时,推荐使用指针类型存入 map,避免频繁拷贝。同时能更方便地进行字段更新。

  • 值类型适合小型、不可变或无需修改的结构
  • 指针类型更适合需要频繁修改字段的场景
  • 注意 nil 指针风险:确保 map 中的指针非 nil 再访问其字段
  • 并发环境下,即使使用指针,也需额外保护数据安全

基本上就这些。关键点在于搞清楚你拿到的是“副本”还是“通往原数据的通道”。用好指针可以简化更新逻辑,但也带来额外责任。

以上就是lang指针与值类型在map更新时的不同的详细内容,更多请关注php中文网其它相关文章!

相关标签:

大家都在看:

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/15111.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部