Les valeurs zéro pour sync.Mutex et sync.RWMutex sont efficaces. Les pointeurs vers les mutex sont donc essentiellement inutiles.

Non recommandé :

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

Recommandé :

var mu sync.Mutex
mu.Lock()

Si vous utilisez un pointeur vers une structure, le mutex devrait être un champ non pointeur de la structure. Même si la structure n’est pas exportée, n’incorporez pas directement le mutex dans la structure.

Non recommandé :

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]
}
// Le champ Mutex, ainsi que les méthodes Lock et Unlock, font partie de l'API exportée par SMap sans déclaration explicite.

Recommandé :

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]
}
// Le mutex et ses méthodes sont des détails d'implémentation de SMap et ne sont pas visibles par ses appelants.