我正在尝试根据帖子Golang的选项1和默认值实现默认值。 但是,当我尝试执行
1 2 3 | not enough arguments in call to test.Concat1 have () want (string) |
码:
1 2 3 4 5 6 7 8 | package test func Concat1(a string) string { if a =="" { a ="default-a" } return fmt.Sprintf("%s", a) } |
//其他包
1 2 3 4 5 | package main func main() { test.Concat1() } |
提前致谢。
- 您的函数仅使用一个参数,而没有传递任何参数。 你的问题是什么?
- 可选参数可能重复吗?
- 可选参数可能重复吗?
我认为您尝试执行的操作不会那样。您可能希望从引用的页面中选择选项#4,该页面使用可变参数。在您的情况下,对我来说,您只想要一个字符串,因此它是这样的:
1 2 3 4 5 6 | func Concat1(a ...string) string { if len(a) == 0 { return"a-default" } return a[0] } |
Go没有可选的函数参数默认值。
您可以通过使用特殊类型在某种程度上模仿它们
包含函数的参数集。
在您的玩具示例中,类似于
1 2 3 4 5 6 7 8 9 10 | type Concat1Args struct { a string } func Concat1(args Concat1Args) string { if args.a =="" { args.a ="default-a" } return fmt.Sprintf("%s", args.a) } |
这里的"技巧"是在Go中每种类型都有其各自的
"零值",以及产生复合类型的值时
使用所谓的文字,可以仅初始化类型的某些字段,因此在我们的示例中将是
1 | s := Concat1(Concat1Args{}) |
与
1 | s := Concat1(Concat1Args{"whatever"}) |
我知道这看起来很笨拙,而我主要是为了展示
示范目的。在实际的生产代码中,其中一个函数
可能有十几个参数或更多参数,将它们打包
专用复合类型通常是唯一明智的方法
要走,但对于像您这样的情况,最好是显式地
将
Go中的默认参数与其他语言中的默认参数不同。在一个函数中,可能总是有一个省略号(总是在最后),这将保留相同类型的值的一部分,因此在您的情况下将是:
1 | func Concat1(a ...string) string { |
但是,这意味着调用方可以传入任意数量的参数,该参数> =0。此外,您还需要检查切片中的参数是否为空,然后自行分配。这意味着在Go中不会通过任何特殊语法为它们分配默认值。这是不可能的,但是你可以做
1 2 3 | if a[0] =="" { a[0] ="default value" } |
如果您想确保用户传递的是零个或一个字符串,只需在您的API中创建两个函数,例如
1 2 3 4 5 | func Concat(a string) string { // ... func ConcatDefault() string { Concat("default value") } |
- "默认参数在Go中的工作方式不同"-是的,因为Go中没有默认参数。 可变参数函数与默认参数无关。 它们允许某种形式的可选参数,但是无法在Go中实现默认参数。