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