Heim >Backend-Entwicklung >Golang >Wie können wir einen generischen Entweder-Typ in Go mithilfe von Generics und Optionals implementieren?
Generische Entweder-Typ-Implementierung in Go
In Go 1.18 bieten Generika vielversprechende Möglichkeiten, komplexe Konzepte auszudrücken. Ein solches Konzept ist der Entweder-Typ, der einen Wert von entweder Typ A oder Typ B darstellen kann. In diesem Artikel werden mögliche Wege zur Implementierung eines Entweder-Typs innerhalb des neuen Generika-Paradigmas von Go untersucht.
Die Herausforderung ergibt sich aus der Einschränkung von Go Schnittstellenmethoden ohne Typparameter. Diese Hürde verhindert die direkte Implementierung einer Entweder-Schnittstelle.
Entweder mit Optional emulieren
Ein Ansatz besteht darin, das funktionale Programmierkonzept von Option anzupassen. Eine Optional[T]-Schnittstelle kann einen Wert vom Typ T oder das Fehlen eines Werts darstellen. Durch die Nutzung der Generika von Go können wir diese Idee erweitern, um ein Optional für entweder A oder B zu erstellen.
type Optional[T any] interface { get() (T, error) } func CreateNone[T any]() Optional[T] { return None[T]{} } func CreateSome[T any](data T) Optional[T] { return Some[T]{data} }
Beides implementieren
Wenn Optional etabliert ist, können wir es jetzt Konstruieren Sie einen Entweder-Typ, der ihn nutzt.
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] }
Linke und rechte Strukturen repräsentieren Werte vom Typ A bzw. B. is_left und is_right geben an, welchen Typ das Entweder enthält. find_left und find_right stellen die optionalen Wrapper für die jeweiligen Werte bereit.
type Left[A, B any] struct { data A } func left[A, B any](data A) Either[A, B] { return Left[A, B]{data} } type Right[A, B any] struct { data B } func right[A, B any](data B) Either[A, B] { return Right[A, B]{data} }
Verwendung
Der implementierte Beide-Typ kann wie folgt verwendet werden:
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) } }
Dieser Ansatz emuliert effektiv den Entweder-Typ und berücksichtigt dabei die Schnittstellenbeschränkungen von Go. Es ermöglicht den Ausdruck von Werten, die zu einem von zwei Typen gehören können, und bietet so mehr Flexibilität und Typsicherheit im Go-Code.
Das obige ist der detaillierte Inhalt vonWie können wir einen generischen Entweder-Typ in Go mithilfe von Generics und Optionals implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!