Go 1.18 a introduit les génériques, qui permettent la création de code de type sécurisé. Cependant, certains comportements peuvent différer des attentes, comme avec les types contravariants.
Considérez la fonction suivante dans Go 1.18 :
func Pipe[A, T1, T2 any](left func(A) T1, right func(T1) T2) func(A) T2 { return func(a A) T2 { return right(left(a)) } }
Cette fonction est conçue pour diriger la sortie de gauche comme entrée à droite. Cependant, il ne parvient pas à se compiler lorsqu'il est utilisé comme suit :
func OpenFile(name string) *os.File { ... } func ReadAll(rdr io.Reader) []byte { ... } var OpenRead = Pipe(OpenFile, ReadAll)
Cela est dû au fait que le compilateur détermine que T1 est *os.File, qui n'est pas identique à io.Reader même s'il est compatible.
Le comportement souhaité serait la possibilité de chaîner la fonction Pipe avec des fonctions qui acceptent un type compatible en entrée. Cela correspond au comportement attendu lors de l'appel de la chaîne sans génériques.
Questions :
Réponses :
Solution de contournement :
Bien qu'il ne soit pas possible d'obtenir un « type-safe au moment de la compilation ", une solution de contournement possible consiste à utiliser l'assertion de type :
func Pipe[A, T1, T2, T3 any](left func(A) T1, right func(T2) T3) func(A) T3 { return func(a A) T3 { return right(any(left(a)).(T2)) } }
Ce code n'est pas de type sécurisé au moment de la compilation, mais il peut fournir la fonctionnalité souhaitée dans certains cas.
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!