Heim > Backend-Entwicklung > Golang > Wie können wir angesichts der Einschränkungen von Generika in Schnittstellenmethoden einen beliebigen Typ in Go implementieren?

Wie können wir angesichts der Einschränkungen von Generika in Schnittstellenmethoden einen beliebigen Typ in Go implementieren?

DDD
Freigeben: 2024-12-14 03:43:09
Original
267 Leute haben es durchsucht

How Can We Implement an Either Type in Go, Given the Limitations of Generics in Interface Methods?

Implementierung eines beliebigen Typs in Go: Navigieren in den Grenzen von Generika

Das Problem und das Ziel

Mit Generika jetzt a Als Teil von Go 1.18 haben sich viele Entwickler zum Ziel gesetzt, Typen zu erstellen, die komplexe Konzepte genau darstellen. Ein klassischer Fall ist der Typ „Entweder[A, B]“, der die Möglichkeit ausdrückt, dass ein Wert einer von zwei unterschiedlichen Typen ist, A oder B.

Hürden bei der Schnittstellendefinition

Bei der Definition einer Schnittstelle für einen „Entweder“-Typ entsteht eine Hürde aufgrund der Einschränkung der Sprache, Typparameter in Schnittstellenmethoden nicht zuzulassen. Diese Einschränkung hindert uns daran, die Methode „Switch“ auszudrücken, die basierend auf der Variante des Werts unterschiedliche Typen zurückgibt.

Eine kreative Implementierung

Um dieses Problem zu lösen, könnte man Folgendes tun Lassen Sie sich von funktionalen Programmiersprachen inspirieren und implementieren Sie einen „Optional“-Typ, der die Fähigkeit kapselt, entweder einen bestimmten Wert oder eine Abwesenheit darzustellen. Darauf aufbauend können wir den Typ „Either“ definieren:

type Either[A, B any] interface {
    is_left() bool
    is_right() bool
    find_left() Optional[A]
    find_right() Optional[B]
}
Nach dem Login kopieren

Anstatt sich auf eine „Switch“-Methode zu verlassen, nutzt dieser Ansatz die Methoden „is_left“ und „is_right“, um den Typ zu bestimmen enthaltenen Wert. Die Methoden „find_left“ und „find_right“ stellen dann einen „Optional“-Wert für den entsprechenden Typ bereit.

Implementierungsdetails und Verwendung

Innerhalb von „Left“ und „ Richtig“, konkrete Typen, die „Entweder“ implementieren, wir verwalten die tatsächliche Nutzlast und stellen die notwendigen booleschen Flags bereit. Die Funktionen „left“ und „right“ fungieren als Konstruktoren und vereinfachen die Instanziierung.

Eine Beispielverwendung zeigt, wie mit dem Typ „Either“ gearbeitet wird:

func main() {
    var e1 Either[int, string] = left[int, string](4143)
    var e2 Either[int, string] = right[int, string]("G4143")

    if e1.is_left() {
        if l, err := e1.find_left().get(); err == nil {
            fmt.Printf("The int is: %d\n", l)
        } else {
            fmt.Fprintln(os.Stderr, err)
        }
    }
}
Nach dem Login kopieren

Fazit

Während die generischen Einschränkungen von Go Herausforderungen darstellen, ist es möglich, sie zu umgehen und leistungsstarke Abstraktionen wie die zu erstellen Typ „Entweder“. Durch die Nutzung von „Optional“ und die Implementierung einer benutzerdefinierten Schnittstelle mit Hilfsmethoden können Entwickler die Flexibilität und Ausdruckskraft gewinnen, die sie in ihrem Go-Code suchen.

Das obige ist der detaillierte Inhalt vonWie können wir angesichts der Einschränkungen von Generika in Schnittstellenmethoden einen beliebigen Typ in Go implementieren?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage