Valores cero para sync.Mutex y sync.RWMutex son efectivos. Por lo tanto, los punteros a mutexes son básicamente innecesarios.

No recomendado:

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

Recomendado:

var mu sync.Mutex
mu.Lock()

Si utiliza un puntero a una estructura, el mutex debe ser un campo no puntero de la estructura. Incluso si la estructura no está exportada, no incruste el mutex directamente en la estructura.

No recomendado:

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]
}
// El campo Mutex, y los métodos Lock y Unlock son parte de la API exportada de SMap sin una declaración explícita.

Recomendado:

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]
}
// El mutex y sus métodos son detalles de implementación de SMap y no son visibles para sus llamadores.