当前位置: 首页 > news >正文

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

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

  • 使用指针。将 map 的值类型改为指向结构体的指针,这样就可以通过指针直接修改结构体字段。
  • 避免直接修改 map 中的值:如果使用值类型,需要在修改时显式地将值取出、修改后再重新赋值回 map。
type Computer struct {CPU intROM intDisk int
}func main() {computers := map[string]Computer{"PC1": {CPU: 4, ROM: 8, Disk: 256},}// 不能直接修改 map 中的结构体字段computers["PC1"].CPU = 8// 获取结构体的副本pc1 := computers["PC1"]// 修改结构体副本的字段,不影响原 map 中的值pc1.CPU = 8
}

为了避免值拷贝的问题,可以将 map 的值类型改为结构体的指针,这样通过键访问 map 时,返回的是结构体的指针,对指针的修改将直接作用于原始的结构体。

type Computer struct {CPU intROM intDisk int
}func main() {// 创建一个 map,其值为指向结构体的指针computers := map[string]*Computer{"PC1": {CPU: 4, ROM: 8, Disk: 256},"PC2": {CPU: 4, ROM: 8, Disk: 256},}// 通过指针直接修改结构体字段computers["PC1"].CPU = 8// 遍历 map 并修改结构体字段for key, computer := range computers {computer.CPU++}
}

也可以取出值,修改后再放回去。

type Computer struct {CPU intROM intDisk int
}func main() {computers := make(map[string]Computer )computers ["PC1"] = Computer{CPU: 4, ROM: 8, Disk: 256}// 显式取出、修改、再赋回 mapcomputer := computers["PC1"]computer.CPU = 8computers["PC1"] = computer
}

相关文章:

  • Qt 最新版6.9.0使用MQTT连接腾讯云详细教程
  • paddlehub搭建ocr服务
  • 免费轻量便携截图 录屏 OCR 翻译四合一!提升办公效率
  • 开搞:第四个微信小程序:图上县志
  • 腾讯云媒体AI解码全球视频出海智能密码
  • 大模型在闭合性胫骨平台骨折诊疗全流程中的应用研究报告
  • UniApp+Vue3微信小程序二维码生成、转图片、截图保存整页
  • 现代生活的健康密钥:养生新法则
  • 记录:uniapp 上线部署到微信小程序vendorjs包过大的问题
  • 外网如何连接内网中的mysql数据库服务器?简单网络工具方案
  • uniapp-商城-65-shop(1-品牌信息显示,将数据库信息同步到vuex的state)
  • uni-app(3):互相引用
  • uni-app学习笔记九-vue3 v-for指令
  • PP-YOLOE-SOD学习笔记1
  • Web前端开发(HTML、CSS快速入门)
  • HarmonyOS开发-自定义倒计时功能
  • 快速创建 Vue 3 项目
  • 深入解析Java泛型:从定义到实战应用
  • RTC技术
  • NBA足球赛事直播源码体育直播M35模板赛事源码
  • 外贸网站源码怎么建/武汉网络推广网络营销
  • 手机友好型网站/网络推广公司运营
  • 唐山哪家做网站好/怎么让某个关键词排名上去
  • 天津红桥网站建设/网站seo技术能不能赚钱
  • 做网站哈尔滨/网站怎样关键词排名优化
  • 广州割双眼皮网站建设/品牌广告和效果广告的区别