Os valores zero para sync.Mutex e sync.RWMutex são eficazes. Portanto, ponteiros para mutexes são basicamente desnecessários.

Não recomendado:

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

Recomendado:

var mu sync.Mutex
mu.Lock()

Se você usar um ponteiro para uma estrutura, o mutex deve ser um campo não ponteiro da estrutura. Mesmo que a estrutura não seja exportada, não incorpore o mutex diretamente na estrutura.

Não 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]
}
// O campo Mutex, os métodos Lock e Unlock fazem parte da API exportada de SMap sem declaração 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]
}
// O mutex e seus métodos são detalhes de implementação de SMap e não são visíveis para seus chamadores.