Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 戈朗:fmt,可变参数和%!(额外类型=值)错误_Go - Fatal编程技术网

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
}