只看代码:(简单到我不敢相信自己)package logimport "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 来回答这个问题。让我知道我怎么了。尽快...
2 回答
神不在的星期二
TA贡献1963条经验 获得超6个赞
这只是一个小错误。您将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)
}
慕码人8056858
TA贡献1803条经验 获得超6个赞
您需要传递a
给Printf
可变参数并将数组转换为可变参数,您需要遵循以下表示法:
func P(format string, a ...interface{}){ fmt.Printf(format, a...) }
Go 编程语言规范
将参数传递给 ... 参数
如果 f 是具有最终参数类型 ...T 的可变参数,则在函数内该参数等同于 []T 类型的参数。在每次调用 f 时,传递给最终参数的参数是一个类型为 []T 的新切片,其连续元素是实际参数,所有这些参数都必须可分配给类型 T。因此,切片的长度是参数绑定到最终参数,并且每个调用站点可能不同。
- 2 回答
- 0 关注
- 111 浏览
添加回答
举报
0/150
提交
取消