Hat die Go-Sprache eine Funktions- / Methodenüberladung?

126

Ich portiere eine C-Bibliothek nach Go. Die AC-Funktion (mit Varargs) ist wie folgt definiert:

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

Also habe ich Wrapper C-Funktionen erstellt:

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

Wenn ich die Funktion in Go wie folgt definiere:

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

Der Go-Compiler beschwert sich:

*Easy·SetOption redeclared in this block

Überlastet die Go-Funktion (Methode)? Oder bedeutet dieser Fehler etwas anderes?

Darius Kucinskas
quelle

Antworten:

164

Nein, tut es nicht.

Weitere Informationen finden Sie in den häufig gestellten Fragen zur Go-Sprache und insbesondere im Abschnitt zum Überladen .

Der Methodenversand wird vereinfacht, wenn kein Typabgleich durchgeführt werden muss. Die Erfahrung mit anderen Sprachen hat gezeigt, dass es gelegentlich nützlich ist, verschiedene Methoden mit demselben Namen, aber unterschiedlichen Signaturen zu verwenden, aber dass dies in der Praxis auch verwirrend und fragil sein kann. Nur nach Namen zu suchen und Konsistenz in den Typen zu erfordern, war eine wichtige vereinfachende Entscheidung im Typensystem von Go.

Update: 07.04.2016

Während Go immer noch keine überladenen Funktionen hat (und dies wahrscheinlich auch nie tun wird), kann das nützlichste Merkmal des Überladens, das Aufrufen einer Funktion mit optionalen Argumenten und das Ableiten von Standardwerten für die ausgelassenen, mithilfe einer variadischen Funktion simuliert werden, die inzwischen hinzugefügt wurde. Dies führt jedoch zum Verlust der Typprüfung.

Zum Beispiel: http://changelog.ca/log/2015/01/30/golang

Lawrence Dol
quelle
20

Demnach ist dies nicht der Fall: http://golang.org/doc/go_for_cpp_programmers.html

Im Abschnitt " Konzeptionelle Unterschiede " heißt es:

"Go unterstützt keine Funktionsüberladung und keine benutzerdefinierten Operatoren."

Merigrim
quelle