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