给定以下代码片段
package main
import (
"fmt"
)
type Message string
const (
ConnectRepositoryError Message = "failed to connect %s repository"
)
func main() {
fmt.Println(ConnectRepositoryError.M("user"))
}
func (m Message) M(args ...string) string {
return fmt.Sprintf(string(m), args)
}
为什么fmt.Sprintf
将指定的字符串(user
(括在方括号中?
failed to connect [user] repository
我希望这个输出:
failed to connect user repository
因为在Message.M()
内部调用fmt.Sprintf()
,向其传递格式字符串string(m)
和作为字符串切片的单个参数args
。切片的格式如下:用空格分隔的元素,用方括号括起来。由于您将单个值传递给M()
,因此它将是一个单元素切片,打印方式类似于[user]
。
相反,您希望将args
作为变量参数传递给fmt.Sprintf()
,因此使用...
。
当然,这将是一个编译时错误,因为fmt.Sprintf()
期望...interface{}
,而...string
不合格。您必须将M
的参数更改为...interface{}
:
func (m Message) M(args ...interface{}) string {
return fmt.Sprintf(string(m), args...)
}
有了这个变化,输出将是(在Go Playground上试试(:
failed to connect user repository
[value value ...]
。
您应该将字符串转换为[]interface{}
,并使用以下语法传递切片的所有元素:
func (m Message) M(args ...string) string {
iargs:=make([]interface{},0,len(args))
for _,x:=range args {
iargs=append(iargs, x)
}
return fmt.Sprintf(string(m), iargs...)
}