Avec l'introduction des génériques dans Go 1.18, il est devenu possible de créer des structures de données génériques, telles que le type Any, qui peut représenter l’une des deux valeurs possibles. Cela résout la limitation du renvoi à la fois d'une valeur et d'une erreur, comme dans l'approche idiomatique Go pour la gestion des erreurs.
Une approche pour implémenter un type générique Any implique l'utilisation d'un type None et d'une interface facultative. None représente l'absence de valeur, tandis que Facultatif fournit un moyen de récupérer une valeur ou une erreur. De plus, les types Gauche et Droite sont définis pour représenter les deux valeurs possibles que l'un ou l'autre peut contenir.
type Optional[T any] interface { get() (T, error) } type None[T any] struct {} type Some[T any] struct { data T }
L'interface L'un ou l'autre propose des méthodes pour déterminer si elle contient une valeur gauche ou droite, ainsi que des méthodes pour accéder aux deux types. de valeurs à l'aide des méthodes de recherche.
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] } type Left[A, B any] struct { data A } type Right[A, B any] struct { data B }
Des fonctions d'assistance sont fournies pour créer des instances de l'une ou l'autre et accéder à leurs valeurs.
func left[A, B any](data A) Either[A, B] func right[A, B any](data B) Either[A, B]
L'exemple suivant illustre le utilisation du type Soit :
var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") fmt.Println(e1) fmt.Println(e2)
Le résultat sera :
left(4143) right(G4143)
En accédant aux méthodes is_left et is_right, il est possible de déterminer le type de valeur détenue par Soit. À l'aide des méthodes find_left et find_right, la valeur réelle peut être récupérée.
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) } } if e2.is_right() { if r, err := e2.find_right().get(); err == nil { fmt.Printf("The string is: %s\n", r) } else { fmt.Fprintln(os.Stderr, err) } }
Cet exemple montre comment le type Each peut être utilisé pour représenter et gérer différents types de valeurs de manière flexible et sécurisée.
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!