Il linguaggio Go ha un sovraccarico di funzioni / metodi?


127

Sto portando una libreria C su Go. La funzione AC (con varargs) è definita in questo modo:

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

Quindi ho creato funzioni C wrapper:

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

Se definisco la funzione in Go in questo modo:

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

Il compilatore Go si lamenta:

*Easy·SetOption redeclared in this block

Quindi Go supporta il sovraccarico della funzione (metodo) o questo errore significa qualcos'altro?

Risposte:


165

No non lo fa.

Vedere le domande frequenti su Go Language e in particolare la sezione sul sovraccarico .

L'invio del metodo è semplificato se non è necessario eseguire anche la corrispondenza del tipo. L'esperienza con altre lingue ci ha detto che avere una varietà di metodi con lo stesso nome ma firme diverse era occasionalmente utile, ma che poteva anche essere confuso e fragile nella pratica. La corrispondenza solo per nome e la necessità di coerenza nei tipi è stata una decisione di semplificazione importante nel sistema di tipi di Go.

Aggiornamento: 07-04-2016

Sebbene Go non abbia ancora funzioni di sovraccarico (e probabilmente non lo farà mai), la caratteristica più utile del sovraccarico, quella di chiamare una funzione con argomenti opzionali e inferire i valori predefiniti per quelli omessi, può essere simulata utilizzando una funzione variadica, che è stata poi aggiunta. Ma questo avviene senza il controllo del tipo.

Ad esempio: http://changelog.ca/log/2015/01/30/golang



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.