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

分享于2022年07月17日 go 问答
【问题标题】:Go 语言有函数/方法重载吗?(Does the Go language have function/method overloading?)
【发布时间】:2022-03-18 05:22:45
【问题描述】:

我正在将 C 库移植到 Go。一个 C 函数(带有可变参数)的定义如下:

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 是否支持函数(方法)重载,或者这个错误是否意味着其他东西?


【解决方案1】:

不,它没有。

请参阅 Go Language FAQ ,尤其是 overloading 部分。

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

更新:2016-04-07

虽然 Go 仍然没有重载函数(并且可能永远不会),但重载最有用的特性,即调用带有可选参数的函数并推断那些省略的函数的默认值可以使用可变参数函数来模拟,从那时起被添加。但这会丢失类型检查。

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