Нулевое значение 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]
}
Для экспортируемых структур:
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]
}
Встраивайте частные типы или типы, которые должны реализовывать интерфейс Mutex. Для экспортируемых типов используйте частное поле.
Читайте также:
- Основы Go: sync.Mutex
- Go style guides: приемники и интерфейсы
- Go style guides: указатели на интерфейсы, проверка интерфейса
Комментариев нет:
Отправить комментарий