我正在尝试根据帖子Golang的选项1和默认值实现默认值。 但是,当我尝试执行go install时,终端中会弹出以下错误:

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中实现默认参数。