ゼロ値を持つ 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 メソッドは、明示的な宣言なしに SMap のエクスポートAPIの一部です。
推奨されます:
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 の実装の詳細であり、呼び出し元には見えません。