在Golang函数中使用默认值

时间:2018-09-20 18:06:45

标签: go default-value

我正在尝试根据帖子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()
}

谢谢。

3 个答案:

答案 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")
}