Heim >Backend-Entwicklung >Golang >Können Sie verhindern, dass ein Typ in Go als Kartenschlüssel verwendet wird?
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 }
Ein Versuch, MyType als Kartenschlüssel zu verwenden:
m := map[MyType]int{}
Führt zu einem Fehler bei der Kompilierung:
invalid map key type MyType
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)
Fehler bei der Kompilierung:
invalid operation: p1 == p2 (struct containing []int cannot be compared)
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 }
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!