Können Sie verhindern, dass ein Typ in Go als Kartenschlüssel verwendet wird?

Linda Hamilton
Freigeben: 2024-10-27 09:06:30
Original
970 Leute haben es durchsucht

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

Verhindern der Typverwendung als Kartenschlüssel

Obwohl es in einigen Fällen im Allgemeinen von Vorteil ist, einen Typ zu haben, der als Kartenschlüssel dienen kann , kann es erforderlich sein, die Verwendung als solche einzuschränken. Während die Annahme, dass das Vorhandensein eines privaten Mitglieds in einem Typ verhindern würde, dass er als Kartenschlüssel außerhalb des definierenden Pakets verwendet wird, ein weit verbreitetes Missverständnis ist, bietet es in Wirklichkeit keinen solchen Schutz.

Bester Ansatz zur Verhinderung der Verwendung von Kartenschlüsseln

Der effektivste Weg, die Verwendung eines Typs als Kartenschlüssel zu verhindern, besteht darin, gegen die Spezifikation für Kartentypen zu verstoßen, die vorschreibt, dass Schlüsseltypen die Definition von ermöglichen müssen Vergleichsoperatoren (== und != ). Durch die Einbindung eines Felds in den Typ, dessen Typ als unvergleichbar gilt, etwa ein Slice oder eine Funktion, können Sie dessen Verwendung als Kartenschlüssel wirksam verhindern.

Betrachten Sie das folgende Beispiel:

type MyType struct {
    S             string
    i             int
    notComparable []int
}
Nach dem Login kopieren

Ein Versuch, MyType als Kartenschlüssel zu verwenden:

m := map[MyType]int{}
Nach dem Login kopieren

Führt zu einem Fehler bei der Kompilierung:

invalid map key type MyType
Nach dem Login kopieren

Konsequenzen der Verhinderung der Verwendung von Kartenschlüsseln

Es ist wichtig zu beachten, dass Sie durch die Durchführung dieser Maßnahme die Möglichkeit verlieren, Werte Ihres Typs mithilfe von Vergleichsoperatoren zu vergleichen. Beispielsweise funktioniert der folgende Code nicht mehr:

p1, p2 := MyType{}, MyType{}
fmt.Println(p1 == p2)
Nach dem Login kopieren

Fehler bei der Kompilierung:

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

Erhaltung der Vergleichbarkeit

Wenn Sie Wenn Sie die Vergleichbarkeit Ihres Typs bewahren und gleichzeitig seine Verwendung als Kartenschlüssel verhindern möchten, können Sie eine Technik anwenden, die Einbettungs- und Wrapper-Typen umfasst. Zum Beispiel:

type myType struct {
    S string
    i int
}

type MyType struct {
    myType
    notComparable []int
}
Nach dem Login kopieren

Durch diesen Ansatz bleibt myType vergleichbar, während der exportierte Wrapper-Typ MyType nicht als Map-Schlüssel verwendet werden kann.

Das obige ist der detaillierte Inhalt vonKönnen Sie verhindern, dass ein Typ in Go als Kartenschlüssel verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!