Go 语言有函数/方法重载吗?
Posted
技术标签:
【中文标题】Go 语言有函数/方法重载吗?【英文标题】:Does the Go language have function/method overloading? 【发布时间】:2011-10-22 15:37:02 【问题描述】:我正在将 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
【讨论】:
因为评论不一定要集中在答案上(因此是 comment):如果您正在寻找高性能语言,请选择 C++,在那里您获得所有这些经过数十年思考的功能。如果您正在寻找易于编码的高级/脚本语言,请选择 Node.js (javascript) 之类的东西。如果你选择了像围棋这样两全其美的东西,你最终会失去两全其美:)【参考方案2】:据此,它不会:http://golang.org/doc/go_for_cpp_programmers.html
在概念差异部分,它说:
“Go 不支持函数重载,也不支持用户定义的操作符。”
【讨论】:
【参考方案3】:尽管这个问题真的很老了,但我仍然想说的是,有一种方法可以实现接近重载函数的东西。虽然它可能不会让代码那么容易阅读。
说要不要重载函数Test()
:
func Test(a int)
println(a);
func Test(a int, b string)
println(a);
println(b);
上面的代码会导致错误。但是,如果您将第一个 Test()
重新定义为 Test1()
并将第二个重新定义为 Test2()
,并使用 go 的 ...
定义一个新函数 Test()
,您将能够调用函数 Test()
超载。
代码:
package main;
func Test1(a int)
println(a);
func Test2(a int, b string)
println(a);
println(b);
func Test(a int, bs ...string)
if len(bs) == 0
Test1(a);
else
Test2(a, bs[0]);
func main()
Test(1);
Test(1, "aaa");
输出:
1
1
aaa
查看更多信息:https://golangbyexample.com/function-method-overloading-golang/
【讨论】:
以上是关于Go 语言有函数/方法重载吗?的主要内容,如果未能解决你的问题,请参考以下文章