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
Susan SarandonOriginal
2024-12-22 06:57:44557Durchsuche

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
}

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
}

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))
}

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
}

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)
}

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
}

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
}

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!

Stellungnahme:
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