ホームページ  >  記事  >  バックエンド開発  >  Go で型がマップ キーとして使用されるのを防ぐことはできますか?

Go で型がマップ キーとして使用されるのを防ぐことはできますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 09:06:30956ブラウズ

 Can You Prevent a Type from Being Used as a Map Key in Go?

マップ キーとしての型の使用の防止

マップ キーとして機能できる型を持つことは一般に有益ですが、場合によっては、 、その使用を制限する必要があるかもしれません。型にプライベート メンバーが存在すると、そのメンバーが定義パッケージの外部でマップ キーとして使用されなくなると考えるのはよくある誤解ですが、実際にはそのような保護は提供されません。

マップ キーの使用を防ぐための最良のアプローチ

型がマップ キーとして使用されるのを防ぐ最も効果的な方法は、キー タイプで次の定義を有効にする必要があるというマップ タイプの仕様に違反することです。比較演算子 (== および != )。スライスや関数など、型が比較できないと見なされるフィールドを型内に組み込むことで、マップ キーとしての使用を効果的に禁止できます。

次の例を考えてみましょう:

type MyType struct {
    S             string
    i             int
    notComparable []int
}

MyType をマップ キーとして使用しようとすると:

m := map[MyType]int{}

コンパイル時エラーが発生します:

invalid map key type MyType

マップ キーの使用を妨げた結果

この措置を講じると、比較演算子を使用して型の値を比較する機能が失われることに注意することが重要です。たとえば、次のコードは機能しなくなります:

p1, p2 := MyType{}, MyType{}
fmt.Println(p1 == p2)

コンパイル時エラー:

invalid operation: p1 == p2 (struct containing []int cannot be compared)

比較可能性の保持

型の比較可能性を維持しながら、型をマップ キーとして使用しないようにしたい場合は、埋め込み型とラッパー型を使用する手法を使用できます。例:

type myType struct {
    S string
    i int
}

type MyType struct {
    myType
    notComparable []int
}

このアプローチを通じて、myType は同等のままですが、エクスポートされたラッパー タイプ MyType をマップ キーとして利用することはできません。

以上がGo で型がマップ キーとして使用されるのを防ぐことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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