Maison > développement back-end > Golang > Pourquoi Go donne-t-il une erreur de variance lors de l'utilisation de fonctions avec des paramètres d'interface ?

Pourquoi Go donne-t-il une erreur de variance lors de l'utilisation de fonctions avec des paramètres d'interface ?

Patricia Arquette
Libérer: 2024-12-29 18:06:17
original
272 Les gens l'ont consulté

Why Does Go Give a Variance Error When Using Functions with Interface Parameters?

Type de fonction avec paramètre d'interface : erreur de variance expliquée

Dans Go, une tentative d'invocation d'une fonction passée en argument à une autre fonction attend un type interface{} peut entraîner une erreur « impossible d'utiliser a (type func(int)) comme type myfunc dans l'argument de b ». Cette erreur survient en raison du manque de prise en charge de la variance dans les interfaces Go.

Variance

La variance fait référence à la capacité d'un sous-type à être utilisé partout où son surtype est attendu. Dans un système de types covariants, les sous-types peuvent remplacer les supertypes dans les positions d'entrée et de sortie. La contravariance, en revanche, permet aux supertypes de remplacer les sous-types dans les positions d'entrée.

Interfaces Go

Les interfaces Go ne présentent pas de variance. Cela 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{}).

Comprendre l'erreur

Dans l'exemple fourni, func(int)int n'implémente pas func(interface{})int parce que :

  • func(int) attend un paramètre int, tandis que func(interface{}) attend un paramètre interface{}.
  • func(int) renvoie un int, tandis que func (interface{}) peut renvoyer n'importe quelle valeur qui implémente interface{}.

Solution

Pour résoudre l'erreur, vous pouvez transmettre func(int) dans une fonction attendant une interface{}, comme indiqué dans le code 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

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!

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