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


以上是传递给fmt.Sprintf的字符串包含在方括号中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>