我正在移植一个C库外带.C函数(带有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 Language FAQ,尤其是overloading部分.

如果方法分派也不需要进行类型匹配,则可以简化方法分派.使用其他语言的经验告诉我们,拥有名称相同但签名不同的各种方法有时是有用的,但在实践中也可能令人困惑和脆弱.在围棋的类型系统中,只按名称匹配并要求类型一致是一个主要的简化决策.

更新日期:2016-04-07

虽然GO仍然没有重载函数(可能永远不会有重载函数),但是重载最有用的功能,即使用可选参数调用函数并推断省略参数的默认值,可以使用后来添加的可变函数来模拟.但这是以丢失类型判断为代价的.

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

Go相关问答推荐

租户GUID X的租户不存在self 邮箱帐户的租户(我是唯一的成员)

使用Golang的Lambda自定义al2运行时,初始化阶段超时

Makefilego version和read命令

Kusto Go API 从多个表查询

Yocto 无法交叉编译 GoLang Wails 应用程序

自定义 Fyne 自适应网格布局

如何在 gocql 中设置最大池大小?

使用 Go 解组 SOAP 消息

无法使用 Golang 扫描文件路径

从动态输入中提取字符串,其中部分字符串可能不存在

GqlGen - 在字段解析器中访问查询输入参数

NaN 是 golang 中的可比类型吗?

Golang模板无法访问embedFS中的文件

无法访问 Go 模块导入的远程存储库

如何在 GORM 中迭代一个 int 数组

具有近似约束的函数值导致的实例化失败

函数调用中的类型参数panic

Golang Echo Labstack 如何在模板视图中调用函数/方法

golang jwt.MapClaims 获取用户ID

手动将 OpenTelemetry 上下文从 golang 提取到字符串中?