Нулевые значения для sync.Mutex
и sync.RWMutex
являются эффективными. Поэтому указатели на мьютексы в основном не нужны.
Не рекомендуется:
mu := new(sync.Mutex)
mu.Lock()
Рекомендуется:
var mu sync.Mutex
mu.Lock()
Если вы используете указатель на структуру, то мьютекс должен быть полем структуры, а не указателем на него. Даже если структура не экспортируется, не встраивайте мьютекс напрямую в структуру.
Не рекомендуется:
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]
}
// Поле Mutex, методы Lock и Unlock являются частью экспортируемого API SMap без явного объявления.
Рекомендуется:
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]
}
// Мьютекс и его методы являются деталями реализации SMap и не видны вызывающим.