[go] Go 언어에 기능 / 메서드 오버로딩이 있습니까?

Go로 C 라이브러리를 이식하고 있습니다. 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는 함수 (메소드) 오버로딩을 지원합니까, 아니면이 오류가 다른 것을 의미합니까?



답변

아니 그렇지 않아.

Go Language FAQ , 특히 오버로딩 섹션을 참조하십시오 .

유형 일치도 수행 할 필요가 없으면 메서드 디스패치가 단순화됩니다. 다른 언어에 대한 경험에 따르면 이름은 같지만 서명이 다른 다양한 방법을 사용하는 것이 때때로 유용하지만 실제로는 혼란스럽고 깨지기 쉽습니다. 이름으로 만 일치하고 유형의 일관성을 요구하는 것은 Go의 유형 시스템에서 주요 단순화 결정이었습니다.

업데이트 : 2016-04-07

Go에는 여전히 오버로드 된 함수가 없지만 (아마도 없을 것입니다) 오버로딩의 가장 유용한 기능인 선택적 인수를 사용하여 함수를 호출하고 생략 된 항목에 대한 기본값을 추론하는 기능은 이후 추가 된 가변 함수를 사용하여 시뮬레이션 할 수 있습니다. 그러나 이것은 유형 검사의 손실로 발생합니다.

예 : http://changelog.ca/log/2015/01/30/golang


답변

이것에 따르면 http://golang.org/doc/go_for_cpp_programmers.html

에서 개념 차이점 절은 말합니다 :

“Go는 함수 오버로딩을 지원하지 않으며 사용자 정의 연산자를 지원하지 않습니다.”


답변

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

이 프로세스는 매개 변수를이 빈 값으로 변환합니다 interface{}.

첫 번째 유형의 변환은 내부 논리 처리입니다.

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


답변