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

hen*_*nry 3 format printf go

看看代码吧:(简单得我自己都不敢相信)

package log

import "fmt"

func P(format string,a ...interface{}){
    fmt.Printf(format,a)
}
Run Code Online (Sandbox Code Playgroud)

当在这样的地方被调用时:

log.P("%s,%s,%d","","",0)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

[  %!s(int=0)],%!s(MISSING),%!d(MISSING)
Run Code Online (Sandbox Code Playgroud)

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

fmt.Printf("%s,%s,%d","","",0)
Run Code Online (Sandbox Code Playgroud)

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

所以问题是:

为什么 log.P 不起作用?

供参考:

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

或者也许我只是不知道如何问,所以我把纯代码放在上面。

或者只是我这次是个超级傻瓜?

我今天注册了 stackoverflow 来寻求这个问题的答案。让我知道我出了什么问题。尽快...

kub*_*ika 5

这只是一个小错误。您正在将fmt.Printfwitha作为单个参数进行调用,但事实并非如此。您需要将其作为可变参数传递。

package main

import (
    "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)
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关可变参数的信息。