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
223 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!

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