我正在将C库移植到Go。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语言常见问题解答,尤其是有关重载的部分。
如果方法调度也不需要进行类型匹配,则可以简化该方法。其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。在Go的类型系统中,仅按名称进行匹配并要求类型一致是简化的主要决定。
更新时间:2016-04-07
尽管Go仍然没有重载函数(并且可能永远不会重载),但是重载最有用的功能(使用可选参数调用函数并为被省略的参数推断默认值)可以使用可变参数函数进行仿真,此函数现已添加。但这带来了类型检查的损失。
例如:http : //changelog.ca/log/2015/01/30/golang