可变参数函数的参数传递

47

情况:

我正在尝试编写一个简单的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 的包装器?

3
顺便说一下,Die函数重新实现了已经准备好的log.Fatal和/或log.Logger.Fatalf功能。 - zzzz
1个回答

67

变参函数以类型为切片的形式接收参数。在这个例子中,你的函数接收了名为args[]interface{}类型。当你将该参数传递给fmt.Sprintf时,你将它作为类型为[]interface{}的单个参数传递。你真正想要的是将args中的每个值作为单独的参数传递(就像你接收它们一样)。为了做到这一点,你必须使用...语法。

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

这也在Go语言规范中得到了解释,请点击此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接