值类型作为map值时每次操作都会复制数据,修改副本不影响原值,需重新赋值才能更新;指针类型存储的是指向数据的地址,可直接修改原始数据,避免拷贝开销。示例中Person结构体使用值类型时更改副本年龄不影响map内原值,而指针类型则能直接更新。建议小对象用值类型保证安全,大对象或频繁修改用指针提升性能,并发访问时均需同步控制,注意nil指针判断。

在Go语言中,值类型和指针类型都可以作为map的键或值使用,但它们的行为有显著差异,尤其在性能、内存占用和数据修改方面。理解这些差异对编写高效、安全的代码至关重要。
值类型作为map的值
当把值类型(如 int、string、struct)作为map的值时,每次插入或读取都会进行值拷贝。
说明:插入结构体时,是将整个结构体复制一份存入map。 从map中取出结构体时,得到的是副本,修改它不会影响map中的原始数据。 若想修改map中的结构体字段,必须重新赋值整个结构体。
示例:
type Person struct { Name string Age int}m := make(map[string]Person)m["alice"] = Person{Name: "Alice", Age: 25}p := m["alice"]p.Age = 26 // 修改的是副本fmt.Println(m["alice"].Age) // 输出 25,原数据未变m["alice"] = p // 需要显式写回
指针类型作为map的值
使用指针类型(如 *Person)可以避免频繁拷贝大对象,并允许直接修改map中的数据。
立即学习“go语言免费学习笔记(深入)”;
说明:存储的是指向实际数据的指针,节省内存和拷贝开销。 通过指针访问和修改原始数据,无需重新赋值。 多个map条目可指向同一对象,需注意意外共享问题。
示例:
m := make(map[string]*Person)m["alice"] = &Person{Name: "Alice", Age: 25}p := m["alice"]p.Age = 26 // 直接修改原始数据fmt.Println(m["alice"].Age) // 输出 26
选择建议
小结构体或基础类型:用值类型更简单安全,避免nil指针问题。 大结构体或需要频繁修改:用指针类型提升性能并简化更新逻辑。 并发场景下:无论值或指针,都需额外同步机制保护map访问。 注意零值行为:值类型字段有默认零值;指针可能为nil,解引用前要判空。基本上就这些。根据数据大小、是否需修改、是否共享等因素决定用值还是指针,合理权衡清晰性与效率。
以上就是Golang值类型和指针类型在Map中的使用的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1406488.html
微信扫一扫
支付宝扫一扫