Go可以有可选参数吗?或者我可以定义两个不同的函数,具有相同的名称和不同数量的参数?
当前回答
另一种可能是使用带有字段的结构体来指示其是否有效。来自sql的null类型,如NullString很方便。不必定义自己的类型很好,但如果你需要一个自定义数据类型,你总是可以遵循相同的模式。我认为从函数定义中可以清楚地看到可选性,并且只需要极少的额外代码或工作。
举个例子:
func Foo(bar string, baz sql.NullString){
if !baz.Valid {
baz.String = "defaultValue"
}
// the rest of the implementation
}
其他回答
Go中不支持可选参数和函数重载。Go确实支持可变数量的参数:参数
我最终使用了参数和可变参数结构的组合。这样,我就不需要改变现有的由多个服务使用的接口,而且我的服务能够根据需要传递额外的参数。golang playground中的示例代码:https://play.golang.org/p/G668FA97Nu
你可以使用指针,如果你不想使用它们,让它们为nil:
func getPosts(limit *int) {
if optParam != nil {
// fetch posts with limit
} else {
// fetch all posts
}
}
func main() {
// get Posts, limit by 2
limit := 2
getPosts(&limit)
// get all posts
getPosts(nil)
}
不——都不是。根据Go for c++程序员文档,
Go不支持函数 重载,不支持用户 定义操作符。
我找不到一个同样明确的声明,说明可选参数不受支持,但它们也不受支持。
Go语言不支持方法重载,但你可以像可选参数一样使用可变参数,也可以使用interface{}作为参数,但这不是一个好的选择。