Maison > développement back-end > Golang > Pourquoi Go signale-t-il une erreur lors du passage d'une fonction avec un type de paramètre spécifique à une fonction acceptant un paramètre Interface{} ?

Pourquoi Go signale-t-il une erreur lors du passage d'une fonction avec un type de paramètre spécifique à une fonction acceptant un paramètre Interface{} ?

DDD
Libérer: 2024-12-25 13:03:10
original
418 Les gens l'ont consulté

Why Does Go Report an Error When Passing a Function with a Specific Parameter Type to a Function Accepting an Interface{} Parameter?

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
}
Copier après la connexion

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)
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal