Types de contravariation dans go 1.18 génériques
dans Go 1.18, les types génériques permettent de définir des fonctions avec des types qui varient en fonction des arguments de type. Contravariance, un type de variance spécifique, permet aux fonctions d'accepter une gamme plus large de types d'entrée tout en conservant une relation bien définie entre les types d'entrée et de sortie.
Fonction de tuyau
La fonction de tuyau fournie vise à composer des fonctions qui transforment les valeurs. Il s'attend à ce que le type de sortie de la fonction gauche correspond au type d'entrée de la fonction de droite. Cependant, dans l'exemple suivant, il ne compile pas:
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)) } } func OpenFile(name string) *os.File { ... } func ReadAll(rdr io.Reader) []byte { ... } var OpenRead = Pipe(OpenFile, ReadAll)
Le compilateur se plaint car t1 est considéré comme * os.file même s'il est compatible avec io.reader.
comportement souhaité. Go ne prend pas en charge les types de résultats covariants, ce qui signifie que le type de sortie d'une fonction ne peut pas varier en fonction du type d'entrée.
Est-ce un bug?
Le comportement dans Go 1.18 n'est pas un bug. C'est par conception, comme expliqué dans la FAQ pour GO Generics.
Savre
Pour résoudre cette limitation, une version modifiée de la fonction de tuyau peut être utilisée, mais il sacrifie la sécurité du type de compilation: (a) Func Pipe [a, t1, t2, t2 t3 func (t2) t3) func (a) t3 { return func (a a) t3 { retour à droite (n'importe quelle (gauche (a)). (T2)) } }
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3