传递给fmt的字符串.Sprintf用方括号括起来



给定以下代码片段

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...)
}

最新更新