Heim > Backend-Entwicklung > Golang > Wie kann ich rekursive Typbeschränkungen in Go Generics mithilfe benutzerdefinierter Schnittstellen definieren?

Wie kann ich rekursive Typbeschränkungen in Go Generics mithilfe benutzerdefinierter Schnittstellen definieren?

Barbara Streisand
Freigeben: 2025-01-04 09:28:34
Original
1014 Leute haben es durchsucht

How Can I Define Recursive Type Constraints in Go Generics Using Custom Interfaces?

Rekursive Typeinschränkungen mit benutzerdefinierten Schnittstellen definieren

In Go-Generika können Typeinschränkungen mithilfe von Schnittstellen definiert werden. Der Standardentwurf lässt jedoch keine rekursiven Typeinschränkungen zu, bei denen die Methode eines Typs ein Argument des generischen Typs hat.

Problemszenario

Betrachten Sie den folgenden Code, der eine Schnittstelle definiert Kleiner und eine Funktion IsLess:

type Lesser interface {
    Less(rhs Lesser) bool
}

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

Das Ausführen dieses Codes führt zu einem Fehler:

Int does not satisfy Lesser: wrong method signature
    got  func (Int).Less(rhs Int) bool
    want func (Lesser).Less(rhs Lesser) bool
Nach dem Login kopieren

Lösung

Um dieses Problem zu beheben, können wir Folgendes definieren Lesser-Schnittstelle und das IsLess Funktion wie folgt:

type Lesser[T any] interface {
    Less(T) bool
}

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

In dieser Definition nimmt die Lesser-Schnittstelle einen Typparameter T und deklariert eine Methode Less, die akzeptiert ein Argument vom Typ T. Die Funktion IsLess schränkt den generischen Typ T ein, um die Schnittstelle Lesser[T] zu implementieren.

Beispielverwendung

Hier ist ein Beispiel für die Verwendung dieser Lösung:

type Apple int

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

func main() {
    fmt.Println(IsLess(Apple(10), Apple(20)))   // true
    fmt.Println(IsLess(Apple(20), Orange(30))) // compilation error: type mismatch
}
Nach dem Login kopieren

In In diesem Beispiel erfüllt der Typ Apple die Schnittstelle Lesser[Apple], da seine Methode Less ein Argument vom Typ Apple akzeptiert. Die Funktion IsLess kann dann verwendet werden, um zwei Apple-Werte zu vergleichen.

Dieser Ansatz ermöglicht rekursive Typbeschränkungen, sodass Sie erzwingen können, dass die Methode eines Typs ein Argument hat vom generischen Typ.

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