格式化错误.新

Ale*_* G. 8 formatting go

我想实现一个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和电话

s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)
Run Code Online (Sandbox Code Playgroud)

在内部Greeting,谁将具有s与相同底层数组相同的值.

  • 它是关于保持错误包"轻"."fmt"包有许多依赖项.一旦导入"fmt",程序就变得庞大/复杂. (2认同)