41

情况:

我正在尝试编写一个简单的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%!(额外 [] 接口 {}=[])

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

1 回答 1

62

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

str := fmt.Sprintf(format, args...)

这在 Go 规范中也有解释

于 2012-09-08T22:12:54.967 回答