只看代码:(太简单了,我简直不敢相信自己
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的基本用法)工作。
所以问题是:
仅供参考:
我相信这很简单,但我只是找不到Google的答案, 从来没有人掉到地狱吗?
或者也许我只是不知道怎么问,所以我在上面放了纯代码。
还是这次我是个超级傻瓜?
我今天注册了stackoverflow来寻求答案。让我知道我怎么了。尽快...
答案 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。切片的长度为 因此,绑定到最终参数的参数数量可能会 每个呼叫站点都不同。