Maison > développement back-end > Golang > Pourquoi le système de types de Go produit-il une « erreur incompatible » lors du passage de fonctions avec des paramètres d'interface ?

Pourquoi le système de types de Go produit-il une « erreur incompatible » lors du passage de fonctions avec des paramètres d'interface ?

Linda Hamilton
Libérer: 2025-01-01 12:21:10
original
466 Les gens l'ont consulté

Why Does Go's Type System Produce

Type func avec erreur de paramètre d'interface incompatible

Problème :
Lors de l'appel d'une fonction passée en argument à une fonction de type qui prend des valeurs conformes à interface{}, une erreur est rencontrée. Par exemple, dans le code suivant :

type myfunc func(x interface{})

func a(num int) {
}

func b(f myfunc) {
    f(2)
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
}
Copier après la connexion

Explication :
Cette erreur provient du manque de prise en charge par Go de la variance dans son système de types. La variance fait référence à la flexibilité d'utilisation des sous-types et des supertypes dans les arguments de paramètres. Les interfaces de Go, contrairement à d'autres systèmes de types, ne prennent pas en charge la variance.

Dans l'exemple donné, même si un int peut être transmis à une fonction qui accepte l'interface{}, cela ne s'étend pas à la compatibilité de func(int) avec fonction(interface{}). En effet, les interfaces dans Go ne sont pas covariantes.

Solution :
En guise de solution de contournement, les fonctions peuvent être transmises aux fonctions attendant une interface{} en implémentant interface{} via une fonction anonyme. :

package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(func(n int) int {
        return n + 2
    })
}
Copier après la connexion

Cette approche exploite le fait que func(int)int implémente interface{}.

Pour plus d'informations sur la variance dans les langages de programmation, pensez à explorer l'article Wikipédia et le message lié ci-dessous :

  • [Variance (informatique)](https:/ /en.wikipedia.org/wiki/Variance_(computer_science))
  • [Variance dans les Programmation](https://www.fluentcpp.com/2018/11/29/variance-in-generic-programming/)

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