Type Func avec incompatibilité des paramètres d'interface
Lors de la définition d'un type de fonction qui accepte toute valeur conforme à une interface, il peut être déroutant de rencontrer une erreur lors de l'appel d'une fonction qui semble correspondre à cette spécification.
Considérez ce qui suit exemple :
type myfunc func(x interface{}) func a(num int) { return } func b(f myfunc) { f(2) return } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b return }
L'erreur survient parce que les interfaces dans Go présentent une invariance, ce qui signifie que même si un int peut être transmis à une fonction attendant une interface{}, il n'en va pas de même pour func(int) et func(interface{}).
Dans Go, les fonctions avec des types compatibles doivent avoir des paramètres et des types de retour identiques. Puisque func(int) et func(interface{}) ne satisfont pas à cette exigence, Go les perçoit comme incompatibles.
Pour résoudre ce problème, envisagez d'utiliser l'approche suivante :
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(add2) }
Dans cet exemple, func(int)int est transmis à une fonction attendant une interface{}. Ceci est autorisé car func(int)int implémente interface{} qui nécessite qu'il ait une seule méthode avec des types d'entrée et de retour spécifiés.
Pour une explication plus détaillée de la variance dans Go, reportez-vous à l'article Wikipédia sur le sujet et l'article de blog liés dans la réponse fournie.
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!