我想实现一个errors.New
接受相同参数的版本,这样fmt.Sprintf
做我写了以下函数:
func NewError(format string, a ...interface{}) error {
return errors.New(fmt.Sprintf(format, a))
}
Run Code Online (Sandbox Code Playgroud)
但是,a
在内部成为单个数组参数,NewError()
从而导致Sprintf()
仅填充格式字符串中的单个参数.我如何强制a
被解释为可变数量的参数?
Tim*_*per 16
fmt.Errorf
已经完成了你想要做的事情.看看它的来源,你可以看到出了什么问题:
// Errorf formats according to a format specifier and returns the string
// as a value that satisfies error.
func Errorf(format string, a ...interface{}) error {
return errors.New(Sprintf(format, a...))
}
Run Code Online (Sandbox Code Playgroud)
请注意您的代码缺少...
后a
.从规格:
将参数传递给...参数
如果最终参数可分配给切片类型
[]T
,则可以将其作为...T
参数的值(如果参数后跟参数)保持不变...
.在这种情况下,不会创建新切片.鉴于切片
s
和电话Run Code Online (Sandbox Code Playgroud)s := []string{"James", "Jasmine"} Greeting("goodbye:", s...)
在内部
Greeting
,谁将具有s
与相同底层数组相同的值.