Type func avec erreur de paramètre d'interface incompatible
Problème :
Lors de l'appel d'une fonction passée en argument à une fonction de type qui prend des valeurs conformes à interface{}, une erreur est rencontrée. Par exemple, dans le code suivant :
type myfunc func(x interface{}) func a(num int) { } func b(f myfunc) { f(2) } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b }
Explication :
Cette erreur provient du manque de prise en charge par Go de la variance dans son système de types. La variance fait référence à la flexibilité d'utilisation des sous-types et des supertypes dans les arguments de paramètres. Les interfaces de Go, contrairement à d'autres systèmes de types, ne prennent pas en charge la variance.
Dans l'exemple donné, même si un int peut être transmis à une fonction qui accepte l'interface{}, cela ne s'étend pas à la compatibilité de func(int) avec fonction(interface{}). En effet, les interfaces dans Go ne sont pas covariantes.
Solution :
En guise de solution de contournement, les fonctions peuvent être transmises aux fonctions attendant une interface{} en implémentant interface{} via une fonction anonyme. :
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(func(n int) int { return n + 2 }) }
Cette approche exploite le fait que func(int)int implémente interface{}.
Pour plus d'informations sur la variance dans les langages de programmation, pensez à explorer l'article Wikipédia et le message lié ci-dessous :
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!