MyStruct
マップを含む構造体があります。同時読み取りと書き込みに対してマップへのアクセスを安全にしたいのですが、ベースに固執しMap
、sync.Map
.
このためMyStruct
、ミューテックスによって保護されている挿入、削除、およびフェッチのメソッドを作成します。コードは次のようになります
type MyStruct struct {
mu sync.Mutex
myMap map[string]string
}
func (myStruct *MyStruct) Add(val string) {
myStruct.mu.Lock()
myStruct.myMap[val] = val
myStruct.mu.Unlock()
}
func (myStruct *MyStruct) Remove(val string) {
myStruct.mu.Lock()
delete(myStruct.myMap, val)
myStruct.mu.Unlock()
}
func (myStruct *MyStruct) Fetch(val string) string {
myStruct.mu.Lock()
ret := delete(myStruct.myMap, val)
myStruct.mu.Unlock()
return ret
}
ここまでは順調ですね。
ただし、一部のクライアントはMyStruct
ループする必要がありますがmyStruct.myMap
、ここで私の質問があります。MyStruct のメソッドで実行されていないループ操作も同時に安全にするための最良の設計はどれですか? 現在、2つのオプションが表示されます
- マップ
myMap
とミューテックスmu
をMyStruct
public にして、ループ スレッドを安全にする責任をクライアントに移します。これは単純ですが、どういうわけか、MyStruct
クライアントをあまり気にしないように感じます - すべてを非公開にして、安全にプレイしたいクライアントにマップのコピーを返すメソッドを追加します。これは「カプセル化」の観点からは優れているように見えますが、同時に、少し重く聞こえます
他に可能性はありますか?どちらのデザインが優れているかについて何か提案はありますか?