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.