Heim >Backend-Entwicklung >Golang >Warum können generische verknüpfte Listen in Go (vor 1.20) nicht als Kartenschlüssel verwendet werden?
Go Generics: Typbeschränkungen für Kartenschlüssel
Frage:
Warum passiert Folgendes? Code kann nicht kompiliert werden, wenn eine generische verknüpfte Liste als Karte verwendet wird Schlüssel?
type List[X any] interface { isList() } type Cons[X any] struct { Data X Next List[X] } func (Cons[X]) isList() {} func main() { x := Cons[int]{5, Nil[int]{}} m := map[List[int]]string{} m[x] = "Hi" fmt.Println(m[x]) fmt.Println(id(x)) }
Antwort:
In Go 1.18 und 1.19 ist die vordeklarierte vergleichbare Einschränkung für Kartenschlüssel erforderlich und beschränkt die Verwendung auf streng vergleichbare Typen Unterstützen Sie ==- und !=-Vergleiche, ohne zur Laufzeit in Panik zu geraten. Obwohl Schnittstellen Gleichheitsvergleiche unterstützen, implementieren sie kein Vergleichbares, da sie über einen unendlichen Typsatz verfügen.
Während die List[X]-Schnittstelle selbst als Zuordnungsschlüssel verwendet werden kann, ist dies bei der Cons[X]-Struktur der Fall nicht vergleichbar implementieren, da es ein List[X]-Feld enthält. Es gibt keine schwächere Einschränkung, die verwendet werden kann, um Typen zu identifizieren, die für die Verwendung als Kartenschlüssel geeignet sind.
In Go 1.20 (Februar 2023) wurde dieses Verhalten jedoch behoben. „comparable“ akzeptiert nun alle Typen, die gemäß der Sprachspezifikation vergleichbar sind, auch wenn diese zur Laufzeit aufgrund des Vergleichs möglicherweise in Panik geraten. Dadurch kann der Code erfolgreich kompiliert werden.
Alternative Einschränkung:
Wenn die Verwendung einer Einschränkung erforderlich ist, die die Methode isList() enthält, können Sie Ihre eigene definieren Einschränkung wie folgt:
type List interface { comparable isList() bool }
Lassen Sie dann Ihre Kartenschlüsselstrukturen diese Listenschnittstelle implementieren, anstatt eine Schnittstelle zu deklarieren Feld.
Das obige ist der detaillierte Inhalt vonWarum können generische verknüpfte Listen in Go (vor 1.20) nicht als Kartenschlüssel verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!