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.