Есть ли в языке Go перегрузка функций / методов?


128

Я портирую библиотеку C на Go. Функция AC (с varargs) определяется следующим образом:

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

Итак, я создал функции оболочки C:

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

Если я определю функцию в Go следующим образом:

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

Компилятор Go жалуется:

*Easy·SetOption redeclared in this block

Так поддерживает ли Go перегрузку функций (методов) или эта ошибка означает что-то другое?

Ответы:


166

Нет.

См. FAQ по языку Go и, в частности, раздел о перегрузке .

Отправка методов упрощается, если также не требуется выполнять сопоставление типов. Опыт работы с другими языками показал нам, что наличие множества методов с одним и тем же именем, но разными сигнатурами иногда бывает полезным, но на практике это может сбивать с толку и ненадежно. Сопоставление только по имени и требование согласованности типов было важным упрощающим решением в системе типов Go.

Обновление: 2016-04-07

Хотя в Go все еще нет перегруженных функций (и, вероятно, никогда не будет), наиболее полезная функция перегрузки - вызов функции с необязательными аргументами и определение значений по умолчанию для тех, которые опущены, - может быть смоделирована с помощью вариативной функции, которая с тех пор была добавлена. Но это происходит при потере проверки типов.

Например: http://changelog.ca/log/2015/01/30/golang.


20

Согласно этому, это не так: http://golang.org/doc/go_for_cpp_programmers.html

В разделе « Концептуальные различия » говорится:

«Go не поддерживает перегрузку функций и не поддерживает пользовательские операторы».


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.