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

Linda Hamilton
リリース: 2024-10-27 09:06:30
オリジナル
970 人が閲覧しました

 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!