首页  >  文章  >  后端开发  >  为什么在使用可变参数调用 `fmt.Fprintf` 包装器时会出现'foo%!(EXTRA []interface {}=[])”?

为什么在使用可变参数调用 `fmt.Fprintf` 包装器时会出现'foo%!(EXTRA []interface {}=[])”?

Susan Sarandon
Susan Sarandon原创
2024-11-11 02:57:03156浏览

Why does

fmt.Fprintf 包装器中的可变函数参数传递问题

本文解决了创建简单的 fmt.Fprintf 包装器时遇到的问题接受可变数量的参数。

问题:调用包装器时输出不正确

调用包装器函数 Die("foo") 时,会产生意外的输出: "foo%!(EXTRA []interface {}=[])"。这提出了两个问题:

  • 为什么这个额外的文本出现在“foo”之后?
  • 围绕 fmt.Fprintf 创建包装器的正确方法是什么?

解决方案:使用 Spread 运算符

Go 中的可变参数函数将参数作为切片接收。在本例中,包装函数 Die 有一个 []interface{} 类型的参数 args。但是,当将此参数传递给 fmt.Sprintf 时,它被视为 []interface{} 类型的单个参数。

要解决此问题并将 args 中的每个值作为单独的参数传递,请使用扩展运算符必须使用 (...)。通过将此语法添加到 fmt.Sprintf 调用中,args 中的各个值将相应地扩展和传递:

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

此方法可确保包装器函数将变量参数正确传递给 fmt.Fprintf。

以上是为什么在使用可变参数调用 `fmt.Fprintf` 包装器时会出现'foo%!(EXTRA []interface {}=[])”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn