为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容3067478 2023-04-10 10:30:55
只看代码:(简单到我不敢相信自己)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)

}



查看完整回答
反对 回复 2023-04-10
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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

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

Go 编程语言规范

将参数传递给 ... 参数

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


查看完整回答
反对 回复 2023-04-10
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信