Go可以有可选参数吗?或者我可以定义两个不同的函数,具有相同的名称和不同数量的参数?
当前回答
你可以使用指针,如果你不想使用它们,让它们为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没有可选参数,也不支持方法重载:
方法调度被简化了 不需要做类型匹配 好。有使用其他语言的经验 告诉我们有各种各样的 方法,但名称相同 偶尔会有不同的签名 有用,但也可能有用 在实践中令人困惑和脆弱。 仅通过名称和要求进行匹配 类型的一致性是主要因素 简化围棋类型中的决策 系统。
另一种可能是使用带有字段的结构体来指示其是否有效。来自sql的null类型,如NullString很方便。不必定义自己的类型很好,但如果你需要一个自定义数据类型,你总是可以遵循相同的模式。我认为从函数定义中可以清楚地看到可选性,并且只需要极少的额外代码或工作。
举个例子:
func Foo(bar string, baz sql.NullString){
if !baz.Valid {
baz.String = "defaultValue"
}
// the rest of the implementation
}
不——都不是。根据Go for c++程序员文档,
Go不支持函数 重载,不支持用户 定义操作符。
我找不到一个同样明确的声明,说明可选参数不受支持,但它们也不受支持。
我最终使用了参数和可变参数结构的组合。这样,我就不需要改变现有的由多个服务使用的接口,而且我的服务能够根据需要传递额外的参数。golang playground中的示例代码:https://play.golang.org/p/G668FA97Nu
Go语言不支持方法重载,但你可以像可选参数一样使用可变参数,也可以使用interface{}作为参数,但这不是一个好的选择。