Golang 访问 map 中的结构体字段时如何避免拷贝

打印 上一主题 下一主题

主题 1706|帖子 1706|积分 5118

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Go 语言中,map 的值范例是按值通报的,因此当访问 map 中的结构体时,返回的是结构体的副本,无法直接修改原始结构体的字段。为了在不进行拷贝的情况下访问和修改 map 中的结构体字段,我们可以接纳以下两种方式:


  • 利用指针。将 map 的值范例改为指向结构体的指针,这样就可以通过指针直接修改结构体字段。
  • 避免直接修改 map 中的值:如果利用值范例,需要在修改时显式地将值取出、修改后再重新赋值回 map。
  1. type Computer struct {
  2.         CPU int
  3.         ROM int
  4.         Disk int
  5. }
  6. func main() {
  7.         computers := map[string]Computer{
  8.                 "PC1": {CPU: 4, ROM: 8, Disk: 256},
  9.         }
  10.         // 不能直接修改 map 中的结构体字段
  11.         computers["PC1"].CPU = 8
  12.         // 获取结构体的副本
  13.         pc1 := computers["PC1"]
  14.        
  15.         // 修改结构体副本的字段,不影响原 map 中的值
  16.         pc1.CPU = 8
  17. }
复制代码
为了避免值拷贝的问题,可以将 map 的值范例改为结构体的指针,这样通过键访问 map 时,返回的是结构体的指针,对指针的修改将直接作用于原始的结构体。
  1. type Computer struct {
  2.         CPU int
  3.         ROM int
  4.         Disk int
  5. }
  6. func main() {
  7.         // 创建一个 map,其值为指向结构体的指针
  8.         computers := map[string]*Computer{
  9.                 "PC1": {CPU: 4, ROM: 8, Disk: 256},
  10.                 "PC2": {CPU: 4, ROM: 8, Disk: 256},
  11.         }
  12.        
  13.         // 通过指针直接修改结构体字段
  14.         computers["PC1"].CPU = 8
  15.         // 遍历 map 并修改结构体字段
  16.         for key, computer := range computers {
  17.                 computer.CPU++
  18.         }
  19. }
复制代码
也可以取出值,修改后再放回去。
  1. type Computer struct {
  2.         CPU int
  3.         ROM int
  4.         Disk int
  5. }
  6. func main() {
  7.         computers := make(map[string]Computer )
  8.         computers ["PC1"] = Computer{CPU: 4, ROM: 8, Disk: 256}
  9.         // 显式取出、修改、再赋回 map
  10.         computer := computers["PC1"]
  11.         computer.CPU = 8
  12.         computers["PC1"] = computer
  13. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表