Go 中 map 套指针本身合法但并发不安全,关键在于对 map 本身的读写是否受保护;多个 goroutine 同时写同一 map(增、删、改 key)会触发 panic,而修改指针指向的值则需单独同步。

Go 语言中,map 套指针本身是语法合法的,但并发读写时是否安全,不取决于“套没套指针”,而取决于 map 本身的并发访问是否受保护。简单说:只要多个 goroutine 同时对同一个 map 进行写操作(哪怕只是修改指针字段),就存在数据竞争风险,会触发 panic 或未定义行为。
例如:
type User struct{ Name string }
var m = make(map[int]*User)
m[1] = &User{Name: "Alice"}
这里 m 存的是 *User 指针,但 m 本身仍是普通 map。如果你在两个 goroutine 中同时执行 m[1] = &User{...} 或 delete(m, 1),就会触发 fatal error: concurrent map writes。
立即学习“go语言免费学习笔记(深入)”;
注意:即使只读不写,如果一边在写、一边在读,也属于并发不安全 — Go 的 map 读操作在扩容期间可能 panic。
比如:
type Cache struct { data map[string]*Item }
type Item struct { value int; mu sync.RWMutex }
看起来每个 Item 都有自己的锁,很安全?错。如果多个 goroutine 同时调用 cache.data["x"] = newItem,还是在写 map,照样竞争。而如果只改 cache.data["x"].value,那没问题 — 因为改的是指针指向的 struct 字段,不是 map 本身。
关键分清: - 写 map(增、删、改 key)→ 必须同步 - 写指针指向的值(如 p.Name = "Bob")→ 只要该值不被其他 goroutine 同时写,就无需额外保护 map
基本上就这些。指针只是值,map 才是并发敏感点。别被“套指针”带偏了重点 — 关键看谁在动 map 本身。
以上就是Golang map套指针安全吗_Golang指针嵌套与并发风险说明的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号