Map-Key-Einschränkung für benutzerdefinierte Typen
Bestimmte Typen sind von Natur aus ungeeignet als Map-Schlüssel, wie zum Beispiel Maps, Slices und Funktionen. Einige Entwickler möchten jedoch möglicherweise ausdrücklich verhindern, dass ein bestimmter benutzerdefinierter Typ als Zuordnungsschlüssel verwendet wird.
Auf den ersten Blick scheint es eine Lösung zu sein, sich auf private Mitglieder innerhalb des Typs zu verlassen, aber dieser Ansatz ist wirkungslos. Um dieses Problem anzugehen, benötigen wir eine grundlegendere Lösung, die sich an die Sprachspezifikation hält.
Der Schlüssel zum Verbot der Verwendung eines Typs als Kartenschlüssel liegt in der Verletzung der Anforderungen für Vergleichsoperatoren. Gemäß der Spezifikation müssen Kartenschlüsseltypen vollständig definierte Vergleichsoperatoren == und != haben. Indem wir also ein Feld mit einem nicht vergleichbaren Typ einschließen, können wir effektiv den gesamten Typ nicht vergleichbar machen.
Betrachten Sie beispielsweise den folgenden Typ:
type MyType struct { A *A b b notComparable []int }
Hinzufügen des Feldes notComparable mit einem Slice-Typ macht den gesamten MyType nicht vergleichbar und verhindert so seine Verwendung als Kartenschlüssel. Dies liegt daran, dass Slices nicht verglichen werden können.
m := map[MyType]int{} // Compile-time error: invalid map key type MyType
Es ist erwähnenswert, dass die Einführung eines nicht vergleichbaren Feldes weitere Auswirkungen haben kann. Dadurch wird es beispielsweise unmöglich, Werte dieses Typs mit Operatoren wie == und != zu vergleichen. Durch sorgfältiges Entwerfen des Typs ist es jedoch möglich, die Vergleichbarkeit für bestimmte Felder beizubehalten und gleichzeitig zu verhindern, dass der Typ als Kartenschlüssel verwendet wird.
Das obige ist der detaillierte Inhalt vonWie kann verhindert werden, dass benutzerdefinierte Typen in Go als Kartenschlüssel verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!