Go - 可变参数函数参数传递

时间:2012-09-08 21:36:23

标签: go variadic-functions

情况:

我正在尝试编写一个简单的fmt.Fprintf包装器,它包含可变数量的参数。这是代码:

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args)
    fmt.Fprintf(os.Stderr, "%v\n", str)
    os.Exit(1)
}

问题:

当我用Die("foo")调用它时,我得到以下输出(而不是“ foo ”):

  

foo%!(EXTRA [] interface {} = [])

  • foo ”之后为什么会有“%!(EXTRA [] interface {} = [])”?
  • 围绕fmt.Fprintf创建包装器的正确方法是什么?

1 个答案:

答案 0 :(得分:38)

Variadic函数接收参数作为类型的切片。在这种情况下,您的函数会收到名为[]interface{}的{​​{1}}。将该参数传递给args时,您将其作为fmt.Sprintf类型的单个参数传递。你真正想要的是将[]interface{}中的每个值作为单独的参数传递(与接收它们的方式相同)。为此,您必须使用args语法。

...

Go规范here中也对此进行了解释。