Valori zero per sync.Mutex e sync.RWMutex sono efficaci. Quindi, i puntatori ai mutex sono fondamentalmente non necessari.

Non raccomandato:

mu := new(sync.Mutex)
mu.Lock()

Raccomandato:

var mu sync.Mutex
mu.Lock()

Se si utilizza un puntatore a una struttura, il mutex dovrebbe essere un campo non puntatore della struttura. Anche se la struttura non è esportata, non incorporare direttamente il mutex nella struttura.

Non raccomandato:

type SMap struct {
  sync.Mutex
  
  data map[string]string
}

func NewSMap() *SMap {
  return &SMap{
    data: make(map[string]string),
  }
}

func (m *SMap) Get(k string) string {
  m.Lock()
  defer m.Unlock()
  
  return m.data[k]
}
// Il campo Mutex, nonché i metodi Lock e Unlock, fanno parte dell'API esportata di SMap senza una dichiarazione esplicita.

Raccomandato:

type SMap struct {
  mu sync.Mutex
  
  data map[string]string
}

func NewSMap() *SMap {
  return &SMap{
    data: make(map[string]string),
  }
}

func (m *SMap) Get(k string) string {
  m.mu.Lock()
  defer m.mu.Unlock()
  
  return m.data[k]
}
// Il mutex e i relativi metodi sono dettagli di implementazione di SMap e non sono visibili ai suoi chiamanti.