Nullwerte für sync.Mutex und sync.RWMutex sind wirksam. Daher sind Zeiger auf Mutexe im Grunde überflüssig.

Nicht empfohlen:

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

Empfohlen:

var mu sync.Mutex
mu.Lock()

Wenn Sie einen Zeiger auf eine Struktur verwenden, sollte der Mutex ein Nicht-Zeiger-Feld der Struktur sein. Selbst wenn die Struktur nicht exportiert ist, sollten Sie den Mutex nicht direkt in die Struktur einbetten.

Nicht empfohlen:

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]
}
// Das Mutex-Feld, die Lock- und Unlock-Methoden sind Teil des exportierten SMap-API, ohne explizite Deklaration.

Empfohlen:

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]
}
// Der Mutex und seine Methoden sind Implementierungsdetails von SMap und sind für die Aufrufer nicht sichtbar.