Maison > développement back-end > Golang > Pourquoi ne puis-je pas transmettre un « func(int) » à une fonction attendant « func(interface{}) » dans Go ?

Pourquoi ne puis-je pas transmettre un « func(int) » à une fonction attendant « func(interface{}) » dans Go ?

Susan Sarandon
Libérer: 2024-12-23 16:09:12
original
526 Les gens l'ont consulté

Why Can't I Pass a `func(int)` to a Function Expecting `func(interface{})` in Go?

Type func avec paramètre d'interface incompatible : compréhension de la variance

Dans Go, rencontrer le "ne peut pas utiliser a (type func(int)) comme tapez myfunc dans l'argument de l'erreur b" lors de l'appel d'une fonction avec un paramètre d'interface peut être déroutante. Ce problème se pose en raison du concept de variance dans les systèmes de types.

Les interfaces de Go ne présentent pas de variance, ce qui signifie qu'une interface ne se comporte pas de manière covariante comme dans certains autres langages de programmation. Lorsqu'un type x implémente une interface ii, cela n'implique pas que func(x) implémente func(ii).

Dans l'exemple fourni, l'erreur se produit car func(int) est incompatible avec func(interface{ }), bien que int soit attribuable à une interface {}. Cette incompatibilité vient du fait que les interfaces ne se comportent pas de manière covariante dans Go.

Pour résoudre ce problème, vous pouvez passer func(int) dans une fonction qui attend une interface{}, comme démontré dans l'exemple suivant :

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

Cela fonctionne parce que func(int)int implémente l'interface{}, "élargissant" efficacement le type à une interface plus générique type.

Pour plus de précisions, reportez-vous à l'article Wikipédia fourni sur la variance et au billet de blog lié qui explore la variance dans divers langages de programmation, en particulier ceux prenant en charge l'héritage.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal