解析包装函数中的可变参数
Go 中的可变参数在接受任意数量的参数方面发挥着至关重要的作用。要有效地利用此功能,必须了解如何处理这些参数。
考虑 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%!(EXTRA []interface {}=[])。这个令人困惑的后缀可以归因于可变参数的传递方式。
根据设计,可变参数函数将参数作为各自类型的切片接收。在本例中,Die 函数接受一个名为 args 的 []interface{} 切片。但是,当随后将此参数传递给 fmt.Sprintf 时,它被视为 []interface{} 类型的单个实体,而不是预期的单个值。
要纠正此问题,... 语法应该是使用如下所示:
str := fmt.Sprintf(format, args...)
使用此方法可确保 args 中的每个值都作为单独的参数传递给 fmt.Sprintf,模仿在 Die 函数中接收它们时的行为。这一关键区别符合 Go 语言规范并保证了预期的输出。
以上是为什么在包装函数中使用可变参数时'fmt.Sprintf”会产生意外的输出?的详细内容。更多信息请关注PHP中文网其他相关文章!