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

iva*_*oid 27 variadic-functions go

情况:

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

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

问题:

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

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

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

Ste*_*erg 40

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

str := fmt.Sprintf(format, args...)
Run Code Online (Sandbox Code Playgroud)

这也被转到说明书中说明这里.