ロックを持つ値を誤ってコピーしてしまうと、両方のコピーが正常に動作しない可能性があります。 通常、このような値はポインター経由で参照される必要があります。 ここで言うロックとは、sync.Mutex や sync.WaitGroup などの sync.Locker を実装している型を指しています。
例:
type SafeInt struct {
m sync.Mutex
i int
}
func (s SafeInt) Inc() { // Mutex がコピーされています
s.m.Lock()
s.i++
s.m.Unlock()
}
「ポインターの追加」クイックフィックスを適用後:
type SafeInt struct {
m sync.Mutex
i int
}
func (s *SafeInt) Inc() {
s.m.Lock()
s.i++
s.m.Unlock()
}