Go语言结构体中嵌入sync.Mutex应选值类型还是指针类型?
结论
你的场景优先选择值类型的sync.RWMutex,也就是第一种定义方式:
type StringSet struct { m map[string]struct{} mu sync.RWMutex }
原因说明
- 无额外初始化成本:值类型的互斥锁在声明时默认就是未锁定的可用状态,不需要额外分配指针内存、手动初始化,减少了漏初始化的风险。
- 不会触发拷贝问题:你当前所有操作
StringSet的方法都使用了指针接收器,只要你全程通过*StringSet指针传递实例、不对StringSet结构体本身做值拷贝(比如按值传参、直接赋值结构体变量),就完全不会触发互斥锁的拷贝,符合「不要拷贝互斥锁」的要求。
什么时候需要用指针类型的互斥锁
只有当你需要多个结构体实例共享同一个互斥锁时,才需要把互斥锁定义为指针类型,这个场景和你「每个实例持有独立mutex」的需求不符,所以不需要用。
注意事项
即使使用值类型的互斥锁,也要严格避免直接拷贝StringSet结构体实例,一旦发生拷贝,新实例的锁和原实例的锁完全独立,会直接导致并发控制失效。
内容的提问来源于stack exchange,提问作者user15558657
相关产品推荐
相关产品推荐

