Go语言是否有函数/方法重载?
我正在将C库移植到Go。 AC函数(带可变参数)定义如下:
curl_easy_setopt(CURL *curl, CURLoption option, ...);
所以我创build了包装C函数:
curl_wrapper_easy_setopt_str(CURL *curl, CURLoption option, char* param); curl_wrapper_easy_setopt_long(CURL *curl, CURLoption option, long param);
如果我这样定义Go的function:
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语言常见问题解答 ,特别是有关重载的部分。
如果不需要进行types匹配,方法调度也会简化。 对其他语言的使用经验告诉我们,使用同一名称但签名不同的多种方法偶尔有用,但在实践中也可能令人困惑和脆弱。 只与名称匹配并要求types一致性是Gotypes系统中一个重要的简化决策。
对于运营商超载,似乎比绝对要求更方便。 没有它,事情就更简单了。
更新:2016-04-07
尽pipeGo仍然没有重载函数(可能永远也不会),但是使用可变参数函数(已经被添加)可以模拟重载的最有用的特性,即调用具有可选参数的函数并推断缺省值的函数。 但这是在types检查的损失。
例如: 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{}
。
第一类转换,然后是内部逻辑处理。