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

时间:2018-09-22 11:29:48

标签: go format printf

只看代码:(太简单了,我简直不敢相信自己

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不起作用?

仅供参考:

我相信这很简单,但我只是找不到Google的答案, 从来没有人掉到地狱吗?

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

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

我今天注册了stackoverflow来寻求答案。让我知道我怎么了。尽快...

2 个答案:

答案 0 :(得分:0)

这只是一个小错误。您以fmt.Printf作为单个参数来调用a,而实际上不是。您需要将其作为可变参数传递。

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)
}

您可以阅读有关可变参数here的信息。

答案 1 :(得分:0)

您需要将a作为可变参数传递给Printf并将数组转换为可变参数,您需要遵循以下表示法:

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

The Go Programming Language Specification

     

Passing arguments to ... parameters

     

如果f是最终参数类型为... T的可变参数,则在   函数参数等于[] T类型的参数。在   每次调用f时,传递给最终参数的参数都是新的   类型为[] T的切片,其连续元素是实际参数,   所有这些都必须可分配给类型T。切片的长度为   因此,绑定到最终参数的参数数量可能会   每个呼叫站点都不同。