Heim > Backend-Entwicklung > Golang > Wie kann ich rekursive Typbeschränkungen in Go Generics erreichen?

Wie kann ich rekursive Typbeschränkungen in Go Generics erreichen?

Susan Sarandon
Freigeben: 2024-12-22 06:57:44
Original
515 Leute haben es durchsucht

How Can I Achieve Recursive Type Constraints in Go Generics?

Rekursive Typeinschränkung mit vordefiniertem Typ

In Go-Generika ist es möglich, Typeinschränkungen für generische Typen mithilfe von Schnittstellen anzugeben. Es kann jedoch schwierig sein, eine Einschränkung zu definieren, die die Implementierung einer Methode mit einem Argument des generischen Typs selbst erfordert.

Einschränkungen des aktuellen Entwurfs

Der aktuelle Entwurf von Go-Generika lässt dies nicht zu rekursive Typbeschränkungen, die es unmöglich machen, das gewünschte Verhalten zu erreichen. Betrachten Sie beispielsweise die folgende Schnittstelle:

type Lesser interface {
    Less(rhs Lesser) bool
}
Nach dem Login kopieren

Wir können diese Schnittstelle für einen benutzerdefinierten Typ wie Int implementieren:

type Int int

func (lhs Int) Less(rhs Int) bool {
    return lhs < rhs
}
Nach dem Login kopieren

Der folgende Code kann jedoch nicht kompiliert werden, weil Int erfüllt die Lesser-Schnittstelle nicht:

func IsLess[T Lesser](lhs, rhs T) bool {
    return lhs.Less(rhs)
}

func main() {
    IsLess[Int](Int(10), Int(20))
}
Nach dem Login kopieren

Lösung mit vordefinierter Schnittstelle

Eine Problemumgehung für diese Einschränkung ist So definieren Sie eine generische Schnittstelle, die sich selbst als Typparameter referenziert:

type Lesser[T any] interface {
    Less(T) bool
}
Nach dem Login kopieren

Diese Schnittstelle gibt an, dass jeder Typ, der die Lesser-Schnittstelle implementiert, über eine Less-Methode verfügen muss, die ein Argument desselben Typs akzeptiert.

Wir können dann die IsLess-Funktion mithilfe dieser generischen Schnittstelle definieren:

func IsLess[T Lesser[T]](x, y T) bool {
    return x.Less(y)
}
Nach dem Login kopieren

Jetzt können wir benutzerdefinierte Typen implementieren, die die Lesser-Funktion erfüllen Einschränkung:

type Apple int

func (a Apple) Less(other Apple) bool {
    return a < other
}

type Orange int

func (o Orange) Less(other Orange) bool {
    return o < other
}
Nach dem Login kopieren

Die Verwendung der IsLess-Funktion mit diesen benutzerdefinierten Typen führt zu korrektem Verhalten:

func main() {
    fmt.Println(IsLess(Apple(10), Apple(20)))   // true
    fmt.Println(IsLess(Orange(30), Orange(15))) // false
}
Nach dem Login kopieren

Diese Lösung erzwingt effektiv die rekursive Typbeschränkung, indem sie die Implementierung einer Methode mit erfordert ein Argument des generischen Typs.

Das obige ist der detaillierte Inhalt vonWie kann ich rekursive Typbeschränkungen in Go Generics erreichen?. 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