Go可以有可选参数吗?或者我可以定义两个不同的函数,具有相同的名称和不同数量的参数?
当前回答
你可以使用一个包含形参的结构体:
type Params struct {
a, b, c int
}
func doIt(p Params) int {
return p.a + p.b + p.c
}
// you can call it without specifying all parameters
doIt(Params{a: 1, c: 9})
与省略号(params…SomeType)相比,其主要优点是可以将param结构体与不同的形参类型一起使用。
其他回答
你可以使用一个包含形参的结构体:
type Params struct {
a, b, c int
}
func doIt(p Params) int {
return p.a + p.b + p.c
}
// you can call it without specifying all parameters
doIt(Params{a: 1, c: 9})
与省略号(params…SomeType)相比,其主要优点是可以将param结构体与不同的形参类型一起使用。
不——都不是。根据Go for c++程序员文档,
Go不支持函数 重载,不支持用户 定义操作符。
我找不到一个同样明确的声明,说明可选参数不受支持,但它们也不受支持。
您可以通过映射传递任意命名参数。如果参数具有不一致的类型,则必须使用“aType = map[key].(*foo.type)”断言类型。
type varArgs map[string]interface{}
func myFunc(args varArgs) {
arg1 := "default"
if val, ok := args["arg1"]; ok {
arg1 = val.(string)
}
arg2 := 123
if val, ok := args["arg2"]; ok {
arg2 = val.(int)
}
fmt.Println(arg1, arg2)
}
func Test_test() {
myFunc(varArgs{"arg1": "value", "arg2": 1234})
}
实现可选参数的一个好方法是使用可变参数。函数实际上接收您指定的任何类型的片。
func foo(params ...int) {
fmt.Println(len(params))
}
func main() {
foo()
foo(1)
foo(1,2,3)
}
我最终使用了参数和可变参数结构的组合。这样,我就不需要改变现有的由多个服务使用的接口,而且我的服务能够根据需要传递额外的参数。golang playground中的示例代码:https://play.golang.org/p/G668FA97Nu