我正在实现一个对标准日志包进行封装的接口,以便创建具有不同日志级别的记录器。
我拥有以下接口:
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{})
}
我的实现大致如下(并非完整代码)
func Info(format string, args ...interface{}){
msg := fmt.Sprintf(format, args...)
log.Println(msg)
}
现在,假设我像这样调用我的库:
logger.Info("Hello %s", "World")
我得到了这样的输出:"Hello %!(EXTRA string=WORLD)",而不是预期的"Hello World"。如果我执行类似的操作,也会得到类似的输出。
msg := fmt.Sprintf(format, args)
这将返回 "Hello World%!EXTRA []interface{}=[]"。
fmt
,但在Sprintf
调用中却使用了format
。 - JimB