我正在将一个 C 库移植到 Go。AC 函数(带有可变参数)定义如下:
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 仍然没有重载函数(并且可能永远不会),但重载最有用的特性,即调用带有可选参数的函数并为省略的参数推断默认值可以使用可变参数函数来模拟,该函数已被添加。但这是以失去类型检查为代价的。