Имеет ли язык Go перегрузку функции/метода?
Я переношу библиотеку C в Go. Функция C (с 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, или эта ошибка означает что-то еще?
Ответы
Ответ 1
Нет.
См. FAQ по языку Go, в частности, раздел о перегрузке.
Диспетчеризация методов упрощается, если не требуется выполнять сопоставление типов. Опыт работы с другими языками показал нам, что наличие различных методов с одинаковыми именами, но разными сигнатурами иногда полезно, но на практике это также может быть запутанным и хрупким. Сопоставление только по имени и требование согласованности типов было основным упрощающим решением в системе типов Go.
Обновление: 2016-04-07
Хотя Go по-прежнему не имеет перегруженных функций (и, вероятно, никогда не будет), наиболее полезная функция перегрузки, а именно вызов функции с необязательными аргументами и выводом значений по умолчанию для пропущенных, может быть смоделирована с помощью функции с переменными числами, которая с тех пор была добавлена. Но это происходит при потере проверки типов.
Например: http://changelog.ca/log/2015/01/30/golang
Ответ 2
В соответствии с этим это не означает: http://golang.org/doc/go_for_cpp_programmers.html
В разделе Концептуальные различия говорится:
"Go не поддерживает перегрузку функций и не поддерживает определенные пользователем операторы".
Ответ 3
func (e *Easy)SetOption(any []interface{})
Процесс преобразует параметры в этот пустой interface{}
.
Первый тип преобразования, а затем внутренние логические процессы.
http://zerousm99.blogspot.kr/2015/01/golang-overload.html