当格式字符串来自参数时,fmt.Printf 中类似“%!s”的错误(go 语言)

只看代码:(简单到我不敢相信自己)


package log


import "fmt"


func P(format string,a ...interface{}){

    fmt.Printf(format,a)

}

在这样的地方调用时:


log.P("%s,%s,%d","","",0)

我收到错误:


[  %!s(int=0)],%!s(MISSING),%!d(MISSING)

但是如果我像这样直接调用 fmt.Printf:


fmt.Printf("%s,%s,%d","","",0)

它完美地工作,非常完美(当然,作为 fmt 的基本使用)。


所以问题是:


为什么 log.P 不起作用?

供参考:


我相信这很简单,但我只是无法通过谷歌找到答案,从来没有人掉入地狱?


或者我只是不知道怎么问,所以我把纯代码放在上面。


还是这次我是个超级傻瓜?


我今天注册了 stackoverflow 来回答这个问题。让我知道我怎么了。尽快...


慕容3067478
浏览 112回答 2
2回答

神不在的星期二

这只是一个小错误。您将fmt.Printfwitha作为单个参数调用,而事实并非如此。您需要将其作为可变参数传递。package mainimport (    "fmt")func P(format string, a ...interface{}) {    fmt.Printf(format, a)}func P2(format string, a ...interface{}) {    fmt.Printf(format, a...)}func main() {    P("%s,%s,%d", "", "", 0)    fmt.Println()    P2("%s,%s,%d", "hello", "world", 0)}

慕码人8056858

您需要传递a给Printf可变参数并将数组转换为可变参数,您需要遵循以下表示法:func P(format string, a ...interface{}){     fmt.Printf(format, a...) }Go 编程语言规范将参数传递给 ... 参数如果 f 是具有最终参数类型 ...T 的可变参数,则在函数内该参数等同于 []T 类型的参数。在每次调用 f 时,传递给最终参数的参数是一个类型为 []T 的新切片,其连续元素是实际参数,所有这些参数都必须可分配给类型 T。因此,切片的长度是参数绑定到最终参数,并且每个调用站点可能不同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go