目次
正解
ホームページ バックエンド開発 Golang マップ内の値が Go で使用可能になるまで待ちます

マップ内の値が Go で使用可能になるまで待ちます

Feb 05, 2024 pm 09:51 PM

等待映射中的值在 Go 中可用

質問の内容

基本的に 3 つのことを行うプログラムがあります。キーの値を設定する、値が存在する場合は値を取得する、または待機するまで待機します。指定されたキーの値が利用可能です。私の最初のアイデアは、map[string]interface{} を使用して新しい型を作成し、そこに「永続的な」値を保存するというものです。それ以外は、値を待つために map[string](chan struct{}) を使用する予定です。 set() メソッドが呼び出されたら、チャネルに書き込みます。チャネルを待っている人は、値がそこにあることがわかります。

キーは事前にわかりません。キーはランダムです。 wait() メソッドを正しく実装する方法がわかりません。

リーリー

問題は、wait() で競合状態が発生していることです。ミューテックスを解放した後、チャネルで受信値のリッスンを開始する前です。

この問題に対処する最善の方法は何ですか?これを達成する方法に関する他の提案は大歓迎です。これを行うためのより良い方法があるはずです。一定の間隔などで値をポーリングしているわけではありません。


正解


あなたが探しているのは、同期マップとメッセージ ブローカーのハイブリッドです。これは、通信および同期チャネルを活用することで実現でき、メッセージが公開されるとすぐにサブスクライバーがメッセージを受信できるようになります (まだキャッシュにない場合)。

リーリー

サブスクライバは待機中にマップ ミューテックスのロックを解除する必要があるため、マップに追加された新しいメッセージに安全にアクセスできません。新しい値は独自のチャネルを介してすべての加入者に直接送信されるため、マップ自体のロックを解除する前にすべての加入者が満足していることを確認するために set に同期を追加する必要がありません。マップを早期にロック解除すると、サブスクライバーはマップを直接読み取ることができますが、同時に新しい値が挿入されることも可能になり、結果が一貫性がなくなります。

実行バージョンには、型パラメータを備えた汎用の map 実装も含まれています: https://go.dev /play/p/an7vrspdgmo

以上がマップ内の値が Go で使用可能になるまで待ちますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

Goでユニットテストをどのように書きますか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

See all articles