零值Mutexes是有效的

零值的 sync.Mutexsync.RWMutex 是有效的,所以基本是不需要一个指向 Mutex 的指针的。

BadGood
  1. mu := new(sync.Mutex)
  2. mu.Lock()
  1. var mu sync.Mutex
  2. mu.Lock()

如果你希望通过指针操作结构体,mutex 可以作为其非指针结构体字段,或者最好直接嵌入结构体中。

  1. type smap struct {
  2. sync.Mutex
  3. data map[string]string
  4. }
  5. func newSMap() smap {
  6. return &smap{
  7. data: make(map[string]string),
  8. }
  9. }
  10. func (m smap) Get(k string) string {
  11. m.Lock()
  12. defer m.Unlock()
  13. return m.data[k]
  14. }
  1. type SMap struct {
  2. mu sync.Mutex
  3. data map[string]string
  4. }
  5. func NewSMap() SMap {
  6. return &SMap{
  7. data: make(map[string]string),
  8. }
  9. }
  10. func (m SMap) Get(k string) string {
  11. m.mu.Lock()
  12. defer m.mu.Unlock()
  13. return m.data[k]
  14. }
嵌入到非导出类型或者需要实现 Mutex 接口的类型。对于导出类型,将 mutex 作为私有成员变量。