Go语言是否有函数/方法重载?

时间:2011-08-08 18:42:48

标签: 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支持函数(方法)重载也是如此,或者此错误是否意味着什么呢?

3 个答案:

答案 0 :(得分:117)

不,不。

请参阅Go Language FAQ,特别是overloading上的部分。

  

如果不需要进行类型匹配,则简化方法调度。使用其他语言的经验告诉我们,使用具有相同名称但签名不同的各种方法偶尔会有用,但在实践中它也可能令人困惑和脆弱。仅按名称匹配并要求在类型中保持一致性是Go类型系统中的主要简化决策。

更新:2016-04-07

虽然Go仍然没有重载函数(可能永远不会),但是重载最有用的功能,即调用具有可选参数的函数并推断那些省略的函数的默认值可以使用variadic函数进行模拟,已被添加。但这是因为失去了类型检查。

例如:http://changelog.ca/log/2015/01/30/golang

答案 1 :(得分:14)

据此,它没有:http://golang.org/doc/go_for_cpp_programmers.html

概念差异部分中,它说:

“Go不支持函数重载,不支持用户定义的运算符。”

答案 2 :(得分:0)

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

该过程将参数转换为此空interface{}

第一种转换,然后是内部逻辑处理。

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