Heim >Backend-Entwicklung >Golang >Wie können wir einen generischen Entweder-Typ in Go mithilfe von Generics und Optionals implementieren?

Wie können wir einen generischen Entweder-Typ in Go mithilfe von Generics und Optionals implementieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 19:55:25590Durchsuche

How Can We Implement a Generic Either Type in Go Using Generics and Optionals?

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!

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