0

0

Golang map的value是指针时要注意什么_Golang共享修改陷阱

P粉602998670

P粉602998670

发布时间:2025-12-03 17:26:55

|

289人浏览过

|

来源于php中文网

原创

Go中map的指针value共享内存地址,修改一个key指向的数据会影响其他同址key;常见坑包括循环复用变量地址、切片转map时直接取址;安全做法是每次new独立实例或显式复制后取址。

golang map的value是指针时要注意什么_golang共享修改陷阱

当 Go 中 map 的 value 是指针类型时,看似只是存了个地址,实则暗藏共享修改风险——多个 key 可能指向同一块内存,改一个,其他全跟着变。

指针 value 本质是共享引用

map 存的是指针值(即内存地址),不是数据副本。如果多个 key 的 value 指向同一个结构体实例,那它们就共用同一份数据:

  • m["a"] 所指对象的字段赋值,m["b"] 读出来也会变(如果它也指向同一地址)
  • 这和切片底层数组共享、或函数传指针导致副作用是同一类问题,但 map 容易让人忽略“value 复制的是指针,不是内容”

常见踩坑场景

以下写法极易中招:

  • 循环中复用同一变量地址:for 循环里取 &item,但 item 是循环变量,每次迭代地址不变,所有 map value 最终都指向最后一次的值
  • 从 slice 转 map 时直接取地址:比如 m[k] = &s[i],而 s 是局部切片,后续修改 s[i] 或重新切片可能让指针悬空或意外共享
  • 初始化时用字面量地址:如 m["x"] = &User{Name: "A"},若多处这样写却用了同一变量名,编译器可能复用空间,导致地址意外相同

安全做法:按需分配,明确所有权

避免共享的核心是——每个 key 对应独立的内存块:

故事AI绘图神器
故事AI绘图神器

文本生成图文视频的AI工具,无需配音,无需剪辑,快速成片,角色固定。

下载

立即学习go语言免费学习笔记(深入)”;

  • 需要独立实例时,每次赋值都 new 一个m["a"] = &User{Name: "A"}(注意:这是新分配)
  • 从已有数据构造指针 value,显式复制再取地址u := originalUser; m["b"] = &u
  • 如果业务本就该共享(如缓存全局配置),那就接受并文档化该行为,别把它当成“意外”

调试小技巧

怀疑指针共享?快速验证:

  • 打印各 value 的指针地址:fmt.Printf("%p\n", m["a"]) 对比是否相同
  • 修改一个后,立刻读另一个 key 看是否联动变化
  • go vet 或静态分析工具(如 golangci-lint + copylock)可捕获部分循环取址问题

基本上就这些。指针 value 不复杂,但容易忽略“复制的是地址”这个前提。想清楚谁该拥有哪块内存,问题就解决了一大半。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

393

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

197

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

212

2025.06.17

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号