回答

收藏

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

技术问答 技术问答 250 人阅读 | 0 人回复 | 2023-09-12

我要 C 库移植到 Go。AC 函数定义如下:' J3 [8 K, Z  o9 ?
    curl_easy_setopt(CURL *curl,CURLoption option,...);
    1 k3 Q+ z' B. t8 S
所以我创建了包装器 C 函数:& Y( c$ s6 T' a2 f8 x
    curl_wrapper_easy_setopt_str(CURL *curl,CURLoption option,char* param);curl_wrapper_easy_setopt_long(CURL *curl,CURLoption option,long param);
    . X- z; Q( A! g# _7 Z# p2 H4 c8 R
如果我这样在 Go 中定义函数:/ V4 \3 m, E  ]0 z" s
    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)))}
    8 j$ c- l5 W3 h  p
Go 编译抱怨:# Y. u5 V, b4 |6 b& N% K* B
    *Easy·SetOption redeclared in this block
    : Q/ w6 g" e* g6 R+ U
那么 Go 是支持函数(方法)重载,还是这个错误意味着什么?
' v( \2 v: K& B* l# R  q( k/ p  V# |' n7 j: R                                                               
8 l1 b+ A. U5 d6 f  z0 T    解决方案:                                                               
+ D1 d+ C3 o( s: p! b5 u8 y                                                                不是的。
: ?7 @3 a: j1 g8 P' T& i请参阅Go 语言常见问题的回答,尤其是重载部分。
5 j  I# u! w( k4 T* W4 v如果不需要匹配类型,则简化了方法分配。使用其他语言的经验告诉我们,有时有各种相同的名称,但不同的签名方法非常有用,但在实践中也可能令人困惑和脆弱。只匹配名称和要求类型的一致性是 Go 类型系统的主要简化决定。
5 v% L4 K$ C6 T) p" |更新:2016-04-07
9 B& s( a& ?/ @1 [4 s, C1 ]虽然 Go 仍然没有重载函数(可能永远不会),但重载最有用的特点是调用具有可选参数的函数,并推断默认值可以使用可变参数函数进行模拟,该函数已被添加。但这是以失去类型检查为代价的。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则