Verhindern, dass Typen als Kartenschlüssel fungieren
In bestimmten Szenarien kann es unerwünscht sein, dass ein bestimmter Typ als Kartenschlüssel verwendet wird . Obwohl sie über ein privates Mitglied verfügen, können solche Typen weiterhin in dieser Funktion verwendet werden. In diesem Artikel werden Methoden zur Verhinderung solcher Vorkommnisse untersucht.
Die Grundvoraussetzung dafür, dass ein Typ als Kartenschlüssel dienen kann, ist, dass alle seine Felder vergleichbar sein müssen. Eine effektive Lösung besteht darin, ein nicht vergleichbares Feld in die Typstruktur aufzunehmen. Typen wie Slices, Karten und Funktionen können nicht verglichen werden, sodass das Hinzufügen eines Felds dieses Typs die Verwendung des umschließenden Typs effektiv ausschließt als Kartenschlüssel.
Zum Beispiel:
type MyType struct { A *A b b preventUseAsKey []int }
Ein Versuch, MyType als Kartenschlüssel zu verwenden:
m := map[MyType]int{}
würde zu der folgenden Kompilierungszeit führen Fehler:
invalid map key type MyType
Es ist jedoch wichtig zu beachten, dass dieser Ansatz einen potenziellen Nachteil mit sich bringt: er macht den Typ nicht vergleichbar. Dies bedeutet Vergleichsoperatoren (z. B. ==, ! =) kann nicht mehr auf den geänderten Typ angewendet werden, was sich auf bestimmte Anwendungsfälle auswirken kann.
Um die Vergleichbarkeit zu wahren und gleichzeitig die Verwendung von Kartenschlüsseln einzuschränken, kann ein Wrapper-Typ verwendet werden. Der Wrapper-Typ bettet den ursprünglichen Typ ein, fügt jedoch ein nicht vergleichbares Feld hinzu. Dadurch können Vergleichsvorgänge für den eingebetteten Typ durchgeführt werden, während gleichzeitig verhindert wird, dass der Wrapper-Typ als Kartenschlüssel verwendet wird.
Das obige ist der detaillierte Inhalt vonWie kann verhindert werden, dass Typen in Go als Kartenschlüssel verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!