我想要实现一个errors.New接受与参数相同的版本,fmt.Sprintf因此我编写了以下函数:
errors.New
fmt.Sprintf
func NewError(format string, a ...interface{}) error { return errors.New(fmt.Sprintf(format, a)) }
但是,它a成为内部的单个数组参数,NewError()从而导致Sprintf()仅在格式字符串中填写单个参数。如何强制a解释为可变数量的参数?
a
NewError()
Sprintf()
fmt.Errorf已经做了您想做的事。查看其来源,可以看到出了什么问题:
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...)) }
请注意,您的代码缺少...after a。从规格:
...
将参数传递给…参数 如果最终参数可分配给切片类型[]T,...T则在参数后跟时可以将其作为参数的值原样传递...。在这种情况下,不会创建新的切片。 给定切片s和调用 s := []string{"James", "Jasmine"} Greeting("goodbye:", s...) 在中Greeting,谁将具有s与相同基础数组相同的值。
如果最终参数可分配给切片类型[]T,...T则在参数后跟时可以将其作为参数的值原样传递...。在这种情况下,不会创建新的切片。
[]T
...T
给定切片s和调用
s
s := []string{"James", "Jasmine"} Greeting("goodbye:", s...)
在中Greeting,谁将具有s与相同基础数组相同的值。
Greeting