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


127

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는 함수 (메소드) 오버로딩을 지원합니까, 아니면이 오류가 다른 것을 의미합니까?

답변:


165

아니 그렇지 않아.

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

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

업데이트 : 2016-04-07

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

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



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.