問題タブ [go-map]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - Go マップでの「同時実行の安全性」のカプセル化
MyStruct
マップを含む構造体があります。同時読み取りと書き込みに対してマップへのアクセスを安全にしたいのですが、ベースに固執しMap
、sync.Map
.
このためMyStruct
、ミューテックスによって保護されている挿入、削除、およびフェッチのメソッドを作成します。コードは次のようになります
ここまでは順調ですね。
ただし、一部のクライアントはMyStruct
ループする必要がありますがmyStruct.myMap
、ここで私の質問があります。MyStruct のメソッドで実行されていないループ操作も同時に安全にするための最良の設計はどれですか? 現在、2つのオプションが表示されます
- マップ
myMap
とミューテックスmu
をMyStruct
public にして、ループ スレッドを安全にする責任をクライアントに移します。これは単純ですが、どういうわけか、MyStruct
クライアントをあまり気にしないように感じます - すべてを非公開にして、安全にプレイしたいクライアントにマップのコピーを返すメソッドを追加します。これは「カプセル化」の観点からは優れているように見えますが、同時に、少し重く聞こえます
他に可能性はありますか?どちらのデザインが優れているかについて何か提案はありますか?
dictionary - マップが別のマップのサブセットであるかどうかを確認する
この質問は、他の多くの言語ですでに回答されています。単純なマップ (ネストなし) を使用する golang で、マップが別のマップのサブセットであるかどうかを調べる方法。例:map[string]string{"a": "b", "e": "f"}
のサブセットですmap[string]string{"a": "b", "c": "d", "e": "f"}
。ジェネリックメソッドが欲しい。私のコード:
セットマップにサブセットマップキーが存在するかどうかを確認したい場合MapIndex
、型のゼロ値を返し、それを何も比較できないようにします。
結局、私は同じ仕事をより良くすることができますか?