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

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

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 поддерживает перегрузку функций (методов) или эта ошибка означает что-то еще?

Ответы [ 3 ]

123 голосов
/ 08 августа 2011

Нет, это не так.

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

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

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

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

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

16 голосов
/ 08 августа 2011

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

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

"Go не поддерживает перегрузку функций и не поддерживает определяемые пользователем операторы."

0 голосов
/ 27 января 2015

func (e *Easy)SetOption(any []interface{})

Процесс преобразует параметры в этот пустой interface{}.

Первый тип преобразования, а затем внутренние логические процессы.

http://zerousm99.blogspot.kr/2015/01/golang-overload.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...