ホームページ  >  記事  >  バックエンド開発  >  Go で一意のマップ キーを作成する最も効率的な方法

Go で一意のマップ キーを作成する最も効率的な方法

WBOY
WBOY転載
2024-02-11 17:06:10497ブラウズ

在 Go 中创建唯一映射键的最有效方法

Go 言語では、一意のマッピング キーを作成する最も効率的な方法が開発者にとって常に懸念事項でした。キーを一意にする必要があるシナリオに直面した場合、効率的で信頼性の高い方法を見つける必要があります。この記事では、PHP エディターの Baicao が、Go 言語で一意のマッピング キーを作成し、コードをより最適化して効率的にするのに役立つ最も効果的な方法の 1 つを共有します。大規模なデータを処理する場合でも、同時実行性の高いアプリケーションを実装する場合でも、これらの方法はパフォーマンスと効率の向上に役立ちます。一緒に調べてみましょう!

質問内容

ライブラリのどこかに map[any]SomeType があります。単一のアプリケーション実行内で競合しないことが保証されるように、ライブラリ ユーザーがこのマップのキーを作成できるようにしたいと考えています。また、これらのキーがマップ検索で効率的になるようにしたいと考えています。

最初に思い浮かぶのは、一意の空のオブジェクトのメモリ アドレスを使用することです。しかし、これまで試したことはすべて失敗しました:

リーリー

印刷

リーリー

したがって、空の構造体変数のアドレスを取得することは、それが関数に渡されるまではほぼ実現可能です。そうすれば差はなくなります。

キー レジストリは不必要に複雑になるため、導入したくありません。また、ライブラリのさまざまなコンシューマーがキーをネゴシエートしたり、名前空間を使用したりする必要があり、文字列のハッシュと比較も不要な複雑になるため、文字列も使用したくありません。

私が思いつかなかった方法はありますか?

解決策

標準ライブラリは、context.Contextを使用するときに「トリック」を使用します。コンテキストには任意の値を含めることができ、これらの値は インターフェース{} キーイング (しばらく前から any) 1.次に、独自のパッケージで、使用するコンテキスト キーの新しいエクスポートされていない型を定義し、そのパッケージで認識されているコンテキスト キーとしてその型の定数のセットを定義できます。ここで重要なのは、型は常に interface{} 型の値の一部であるため、パッケージのキーと競合するインターフェース値を作成することはできないということです。

基本的には次のとおりです:

リーリー

ここで、key インターフェース{} = KeyFoo を実行すると、プログラム内の他のコードが key と同じ値を持つことができないことがほぼ保証されます。 (への内部ポインタ) 入力 contextKey はエクスポートされません。 どのように機能するかを理解するには、この古典的な記事を読んでください (少し錆びていますが、それでも 99% 正しいです)。

私にとって、これは前進のように見えます。パッケージのユーザーは独自のキーを生成してマップに送信できます。マップのキー タイプは interface {} または any## である必要があります。 #。これらのキーを渡すために集中レジストリは必要ありません。

1 詳細については、

context.Context.Value() および context.WithValue() を参照してください。後者では、キーの生成方法に関するヒントがさらに提供されます。

以上がGo で一意のマップ キーを作成する最も効率的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。