O idioma Go possui sobrecarga de função / método?


127

Estou portando uma biblioteca C para Go. A função CA (com varargs) é definida assim:

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

Então eu criei as funções do wrapper C:

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

Se eu definir a função em Go, desta forma:

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)))
}

O compilador Go reclama:

*Easy·SetOption redeclared in this block

O Go suporta sobrecarga de função (método) ou esse erro significa outra coisa?

Respostas:


165

Não, não tem.

Consulte as Perguntas frequentes sobre o idioma Go e, especificamente, a seção sobre sobrecarga .

O envio de métodos é simplificado se não for necessário fazer a correspondência de tipos também. A experiência com outros idiomas nos disse que ter uma variedade de métodos com o mesmo nome, mas com assinaturas diferentes, era ocasionalmente útil, mas também poderia ser confuso e frágil na prática. Combinar apenas pelo nome e exigir consistência nos tipos foi uma decisão importante e simplificadora no sistema de tipos da Go.

Atualização: 07-04-2016

Embora o Go ainda não tenha funções sobrecarregadas (e provavelmente nunca terá), o recurso mais útil da sobrecarga, o de chamar uma função com argumentos opcionais e inferir padrões para os omitidos, pode ser simulado usando uma função variada, que já foi adicionada. Mas isso ocorre com a perda de verificação de tipo.

Por exemplo: http://changelog.ca/log/2015/01/30/golang



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.