私は最近、Go 言語を使用しているときに sync.Map 型に関する問題に遭遇しました。特に同時実行環境で、その中のデータを変更する方法です。ここで私の理解と解決策を共有したいと思います。
Go 言語の sync.Map 型は、同時環境で使用できるスレッドセーフな Map です。使用方法は非常に簡単です。次のコードを使用して sync.Map 変数を定義できます:
var m sync.Map
次に、Load メソッドと Store メソッドを使用して要素の読み取りと書き込みを行うことができます。例:
m.Store("key1", "value1") v, ok := m.Load("key1")
この処理で注意する必要があるのは、Store メソッドの最初のパラメータがキー、2 番目のパラメータが値、Load メソッドの戻り値が 2 つあり、1 つ目は値、2 つ目はbool 型 キーが見つかったかどうかを示す値。
しかし、sync.Map 内の要素を変更する必要がある場合はどうすればよいでしょうか?通常のマップ タイプのように、添字を使用して値を直接変更することはできません。 Go の公式ドキュメントに変更について書かれていることを見てみましょう:
It must not be copied after first use. To avoid ownership issues, values stored in the Map should not be modified.
ドキュメントには、sync.Map の値は変更すべきではないと記載されています。これは、map が参照型であり、これを変更すると他のコルーチンに影響を及ぼし、競合状態やデータの不整合が発生する可能性があるためです。
それでは、既存のキーと値のペアを変更したい場合はどうすればよいでしょうか?
実際には、sync.Map 型内で Range メソッドを使用して、最初にこのメソッドを通じて変更する必要がある要素を読み取り、次に新しい値を書き換えることができます。サンプル コードは次のとおりです。
m.Range(func(key, value interface{}) bool { if key == "key1" { m.Store(key, "newvalue") } return true })
ここでは、まず Range メソッドを使用してマップ全体を走査し、変更する必要があるキーが存在するかどうかを判断します。存在する場合は、Store メソッドを使用して新しい値を書き換えます。 Range メソッドが false を返した場合、トラバーサル操作は停止することに注意してください。
最後に、要約する必要があります:
この記事がお役に立てば幸いです。不適切な点がございましたら、読者の皆様、アドバイスをお願いいたします。
以上がgolang同期マップの変更の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。