Go 戈朗:fmt,可变参数和%!(额外类型=值)错误
我正在围绕标准日志包实现一个包装器,以创建具有不同日志级别的日志记录器 我有以下界面:Go 戈朗:fmt,可变参数和%!(额外类型=值)错误,go,Go,我正在围绕标准日志包实现一个包装器,以创建具有不同日志级别的日志记录器 我有以下界面: type Logger interface { Trace(fmt string, args ...interface{}) Debug(fmt string, args ...interface{}) Info(fmt string, args ...interface{}) Warn(fmt string, args ...interface{}) Error(fmt string,
type Logger interface {
Trace(fmt string, args ...interface{})
Debug(fmt string, args ...interface{})
Info(fmt string, args ...interface{})
Warn(fmt string, args ...interface{})
Error(fmt string, args ...interface{})
Fatal(fmt string, args ...interface{})
Panic(fmt string, args ...interface{})
}
在实现中,我有类似的东西(不是确切的代码)
现在,假设我这样调用我的库:
logger.Info("Hello %s", "World")
我得到打印输出:“Hello%!(EXTRA string=WORLD)”,而不是预期的“Hello WORLD”。如果我这样做,会有类似的输出
msg := fmt.Sprintf(format, args)
这将返回“Hello World%!EXTRA[]interface{}=[]”我无法重现此行为。你确定这不是一个简单的错误,你忘了在这里显示 印刷品
Hello World
根据,
%!(EXTRA string=WORLD)
是在您传递额外参数时添加到字符串中的,这是格式所无法预料的。可能您正在使用格式字符串“Hello World”而不是“Hello%s”,或者将参数传递了两次?错误在椅子和键盘之间。我混淆了以下接口:
func Print(v ...interface{})
func Printf(format string, v ...interface{})
我的一些代码在没有格式字符串的情况下调用库。有关更详细的示例,请参见此处:当消息没有动词且varargs为空但来自其他地方时,也会发生这种情况:
func CustomPrintf(message string, a ...interface{}) {
fmt.Printf(message, a) // for no verbs in message you'll get this "EXTRA" suffix
}
这是一般错误的特例。你必须先把
a
散开。因此,请使用fmt.Printf(message,a…)
再次将其发送到varags。您的格式字符串参数称为fmt
,但您在Sprintf
调用中使用了format
。这并没有说明您所描述的内容:错误确实发生在椅子和键盘之间。我混淆了以下接口:func Print(v…interface{})和'func Printf(format string,v…interface{})
我的一些代码调用库时没有格式字符串。请参阅此处了解更详细的示例:@BoppreH,fmt文档参考非常宝贵。
func Print(v ...interface{})
func Printf(format string, v ...interface{})
func CustomPrintf(message string, a ...interface{}) {
fmt.Printf(message, a) // for no verbs in message you'll get this "EXTRA" suffix
}