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
Libérer: 2024-12-24 19:55:25
original
641 Les gens l'ont consulté

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}
}
Copier après la connexion

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]
}
Copier après la connexion

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}
}
Copier après la connexion

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)
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal