Czy język Go ma przeciążenie funkcji / metod?

127

Przenoszę bibliotekę C do Go. Funkcja AC (z varargs) jest zdefiniowana w następujący sposób:

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

Utworzyłem więc funkcje opakowujące C:

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

Jeśli zdefiniuję funkcję w Go w ten sposób:

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

Kompilator Go narzeka:

*Easy·SetOption redeclared in this block

Czy więc przeciążenie funkcji (metody) obsługi Go, czy ten błąd oznacza coś innego?

Darius Kucinskas
źródło

Odpowiedzi:

165

Nie.

Zobacz często zadawane pytania dotyczące języka Go , aw szczególności sekcję dotyczącą przeciążania .

Wysyłanie metod jest uproszczone, jeśli nie ma również potrzeby dopasowywania typów. Doświadczenie z innymi językami pokazało nam, że posiadanie różnych metod o tej samej nazwie, ale z różnymi podpisami, było czasami przydatne, ale w praktyce może być również mylące i kruche. Dopasowanie tylko według nazwy i wymaganie spójności typów było główną decyzją upraszczającą w systemie typów Go.

Aktualizacja: 2016-04-07

Chociaż Go nadal nie ma przeciążonych funkcji (i prawdopodobnie nigdy nie będzie), najbardziej użyteczną cechą przeciążania jest wywoływanie funkcji z opcjonalnymi argumentami i wnioskowanie o wartościach domyślnych dla tych pominiętych, którą można zasymulować za pomocą funkcji wariadycznej, która została już dodana. Ale dzieje się tak z utratą sprawdzania typu.

Na przykład: http://changelog.ca/log/2015/01/30/golang

Lawrence Dol
źródło
20

Zgodnie z tym nie: http://golang.org/doc/go_for_cpp_programmers.html

W sekcji Różnice koncepcyjne jest napisane:

„Go nie obsługuje przeciążania funkcji i nie obsługuje operatorów zdefiniowanych przez użytkownika”.

Merigrim
źródło