Heim > Backend-Entwicklung > Golang > Warum können generische verknüpfte Listen in Go (vor 1.20) nicht als Kartenschlüssel verwendet werden?

Warum können generische verknüpfte Listen in Go (vor 1.20) nicht als Kartenschlüssel verwendet werden?

Susan Sarandon
Freigeben: 2024-12-18 12:50:13
Original
951 Leute haben es durchsucht

Why Can't Generic Linked Lists Be Used as Map Keys in Go (Prior to 1.20)?

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))
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage