传递给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
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上尝试):