ホームページ >バックエンド開発 >Golang >Go マップにカスタム キーの等価性を実装するにはどうすればよいですか?

Go マップにカスタム キーの等価性を実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-02 21:31:39917ブラウズ

How Can I Implement Custom Key Equality for Go Maps?

Go マップのカスタム キー同等性

Go でマップを作成する場合、実装されている限り、任意の型をキーとして使用できます。同等のインターフェイス。デフォルトでは、Go はキーの比較に組み込みの等価演算子 (==) を使用します。ただし、独自の等価基準を定義したい場合もあります。

次のカスタム キー タイプを考えてみましょう:

type Key struct {
    a *int
}

Key の 2 つのインスタンスを比較するには、独自の Equal を使用する必要があります。 function:

func Equal(x Key, y Key) bool {
    return *x.a == *y.a
}

回避策

残念ながら、Go ではマップ キーにカスタム ハッシュ関数や等価関数を指定することはできません。代わりに、次の回避策を使用できます:

  1. キー属性の導出: Key 構造体をキーとして直接使用する代わりに、属性 (整数や文字列など) を導出します。これはキーの ID として機能します。衝突が意味的に同一のキーに対してのみ発生するようにします。
  2. ハッシュ関数の実装: 派生属性を計算し、(ハッシュ用) 整数として返す Key のメソッドを作成します。
func (k *Key) HashKey() int {
    return *(*k).a
}

例使用法

上記の例を使用すると、マップは次のようになります。

k1, k2 := Key{intPtr(1)}, Key{intPtr(2)}
m := map[int]string{}
m[k1.HashKey()] = "one"
m[k2.HashKey()] = "two"

注意事項

このアプローチは不変性に依存していることに注意してください。派生キー属性の。 Key 構造体のいずれかのフィールドが変更されると、キーの ID が変更され、期待どおりに動作しなくなります。

以上がGo マップにカスタム キーの等価性を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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