Maison >développement back-end >Golang >Comment pouvons-nous implémenter un type générique de l'un ou l'autre dans Go en utilisant des génériques et des options ?

Comment pouvons-nous implémenter un type générique de l'un ou l'autre dans Go en utilisant des génériques et des options ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 19:55:25594parcourir

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

Implémentation générique de l'un ou l'autre type dans Go

Dans Go 1.18, les génériques offrent des possibilités prometteuses pour exprimer des concepts complexes. L'un de ces concepts est le type Soit, qui peut représenter une valeur de type A ou de type B. Cet article explore les moyens potentiels d'implémenter un type Soit dans le nouveau paradigme générique de Go.

Le défi découle de la restriction de Go sur méthodes d’interface n’ayant aucun paramètre de type. Cet obstacle empêche la mise en œuvre directe d'une interface Soit.

Émulation de Soit avec Optionnel

Une approche consiste à adapter le concept de programmation fonctionnelle d'Option. Une interface Facultative[T] peut représenter une valeur de type T ou l’absence de valeur. En tirant parti des génériques de Go, nous pouvons étendre cette idée pour créer un facultatif pour A ou B.

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}
}

Mise en œuvre de l'un ou l'autre

Une fois l'option établie, nous pouvons maintenant construisez un type soit qui l'exploite.

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

Les structures gauche et droite représentent respectivement les valeurs de type A et B. is_left et is_right indiquent quel type est détenu par l'un ou l'autre. find_left et find_right fournissent les wrappers facultatifs pour les valeurs respectives.

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}
}

Utilisation

L'un ou l'autre type implémenté peut être utilisé comme suit :

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

Cette approche émule efficacement le type Soit tout en respectant les contraintes d'interface de Go. Il permet l'expression de valeurs pouvant appartenir à l'un des deux types suivants, offrant une plus grande flexibilité et une plus grande sécurité de type dans le code Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn