Go 中可变参数函数的概念允许函数接受可变数量的参数。然而,当将这些参数传递给其他函数时,正确处理参数扩展至关重要。
问题:
考虑以下 Die 函数,它用作包装器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 {}=[])”,而不仅仅是“foo”。
解释:
可变参数函数将其参数视为特定类型的切片。在 Die 函数中,args 是 []interface{} 类型的切片。当传递给 fmt.Sprintf 时,它被视为 []interface{} 类型的单个参数,而不是扩展各个值。
解决方案:
通过正确使用单个参数,请使用 ... 语法:
str := fmt.Sprintf(format, args...)
这会扩展 args 切片并将每个值作为单独的参数传递。
其他信息:
Go 规范进一步阐明了这种行为:
“可变参数函数参数的类型是各个参数类型的切片。调用可变参数函数提供了从一组参数的隐式转换。为切片类型提供值。”
通过理解这个概念,您可以正确地将可变参数传递给其他函数并避免意外的输出。
以上是如何将可变参数函数参数传递给 Go 中的其他函数?的详细内容。更多信息请关注PHP中文网其他相关文章!