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