Le langage Go a-t-il une surcharge de fonction / méthode?

127

Je porte une bibliothèque C sur Go. La fonction AC (avec varargs) est définie comme ceci:

curl_easy_setopt(CURL *curl, CURLoption option, ...); 

J'ai donc créé des fonctions wrapper C:

curl_wrapper_easy_setopt_str(CURL *curl, CURLoption option, char* param);
curl_wrapper_easy_setopt_long(CURL *curl, CURLoption option, long param);

Si je définis la fonction dans Go comme ceci:

func (e *Easy)SetOption(option Option, param string) {
    e.code = Code(C.curl_wrapper_easy_setopt_str(e.curl, C.CURLoption(option), C.CString(param)))
}

func (e *Easy)SetOption(option Option, param long) {
    e.code = Code(C.curl_wrapper_easy_setopt_long(e.curl, C.CURLoption(option), C.long(param)))
}

Le compilateur Go se plaint:

*Easy·SetOption redeclared in this block

Est-ce que Go prend en charge la surcharge des fonctions (méthodes) ou cette erreur signifie-t-elle autre chose?

Darius Kucinskas
la source

Réponses:

165

Non.

Consultez la FAQ de Go Language , et plus particulièrement la section sur la surcharge .

La répartition des méthodes est simplifiée si elle ne nécessite pas non plus de correspondance de type. L'expérience avec d'autres langues nous a montré qu'avoir une variété de méthodes avec le même nom mais avec des signatures différentes était parfois utile mais que cela pouvait aussi être déroutant et fragile dans la pratique. Faire correspondre uniquement par nom et exiger la cohérence dans les types était une décision de simplification majeure dans le système de type de Go.

Mise à jour: 07/04/2016

Bien que Go n'ait toujours pas de fonctions surchargées (et ne le sera probablement jamais), la fonctionnalité la plus utile de la surcharge, celle d'appeler une fonction avec des arguments optionnels et de déduire des valeurs par défaut pour celles omises, peut être simulée à l'aide d'une fonction variadique, qui a depuis été ajoutée. Mais cela vient à la perte de la vérification de type.

Par exemple: http://changelog.ca/log/2015/01/30/golang

Lawrence Dol
la source
20

Selon cela, ce n'est pas le cas: http://golang.org/doc/go_for_cpp_programmers.html

Dans la section Différences conceptuelles , il est dit:

"Go ne prend pas en charge la surcharge de fonctions et ne prend pas en charge les opérateurs définis par l'utilisateur."

Merigrim
la source