In Go 1.18 und früher ist die vordeklarierte vergleichbare Einschränkung für Typen erforderlich, die als Kartenschlüssel verwendet werden. Diese Einschränkung stellt sicher, dass der Typ die Operatoren == und != unterstützt und nicht in Panik gerät, wenn diese Operatoren verwendet werden.
Diese Einschränkung ist jedoch nicht immer für Typen geeignet, die als Kartenschlüssel verwendet werden können. Der folgende Code definiert beispielsweise eine generische verknüpfte Liste:
type List[X any] interface { isList() } type Cons[X any] struct { Data X Next List[X] } func (Cons[X]) isList() {} type Nil[X any] struct{} func (Nil[X]) isList() {}
Dieser Code definiert eine Listenschnittstelle, die durch zwei Typen implementiert wird: Cons und Nil. Der Cons-Typ stellt eine nicht leere Liste dar, während der Nil-Typ eine leere Liste darstellt.
Der folgende Code verwendet die List-Schnittstelle, um eine Zuordnung von Listen zu Zeichenfolgen zu erstellen:
type List[X any] interface { isList() } func main() { x := Cons[int]{5, Nil[int]{}} m := map[List[int]]string{} m[x] = "Hi" // succeeds fmt.Println(m[x]) // prints "Hi" }
Dieser Code wird erfolgreich kompiliert und ausgeführt. Wenn wir jedoch versuchen, eine Methode für den Typ Cons zu verwenden, erhalten wir einen Compilerfehler:
type List[X any] interface { isList() } func main() { x := Cons[int]{5, Nil[int]{}} fmt.Println(id(x)) // error: Cons[int] does not implement comparable }
Die Fehlermeldung weist darauf hin, dass der Typ Cons[int] die vergleichbare Einschränkung nicht implementiert. Dies liegt daran, dass der Cons-Typ ein Feld vom Typ List[int] hat und die List[int]-Schnittstelle die vergleichbare Einschränkung nicht implementiert.
Eine mögliche Lösung für dieses Problem ist die Verwendung einer schwächeren Typeinschränkung. Beispielsweise könnten wir die folgende Einschränkung verwenden:
type List[X any] interface { isList() Comparable() bool }
Diese Einschränkung würde es uns ermöglichen, den Cons-Typ als Kartenschlüssel zu verwenden, auch wenn sie die vergleichbare Einschränkung nicht implementiert.
Die vergleichbare Einschränkung ist die korrekte Catch-All-Einschränkung für Kartenschlüssel. Alle Typen, die gemäß der Go-Spezifikation vergleichbar sind, können die vergleichbare Einschränkung erfüllen, auch wenn der Vergleich zur Laufzeit abstürzen kann. Ihr Code wird wie erwartet in 1.20 kompiliert.
Dies behebt endlich die Inkonsistenz in der vorherigen Go-Version bezüglich spezifikationsvergleichbarer Typen gegenüber vergleichbaren Typen.
Das obige ist der detaillierte Inhalt vonKann die „vergleichbare' Einschränkung von Go Generics für Kartenschlüssel gelockert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!