为什么这些方法具有不同的相同功能?

时间:2018-01-09 03:26:16

标签: go logging

func (log Logger) Warn(arg0 interface{}, args ...interface{}) error {
const (
    lvl = WARNING
)
var msg string
switch first := arg0.(type) {
case string:
    // Use the string as a format string
    msg = fmt.Sprintf(first, args...)
case func() string:
    // Log the closure (no other arguments used)
    msg = first()
default:
    // Build a format string so that it will be similar to Sprint
    msg = fmt.Sprintf(fmt.Sprint(first)+strings.Repeat(" %v", len(args)), args...)
}
log.intLogf(lvl, msg)
return errors.New(msg)
}

func (log Logger) Info(arg0 interface{}, args ...interface{}) {
const (
    lvl = INFO
)
switch first := arg0.(type) {
case string:
    // Use the string as a format string
    log.intLogf(lvl, first, args...)
case func() string:
    // Log the closure (no other arguments used)
    log.intLogc(lvl, first)
default:
    // Build a format string so that it will be similar to Sprint
    log.intLogf(lvl, fmt.Sprint(arg0)+strings.Repeat(" %v", len(args)), args...)
}

}

这两个功能来自log4go库的源代码,我不知道为什么Warn(实际上所有级别都高于Warn)与Info不同,为什么Warn函数Sprintf首先是msg而Info将所有args传递给iniLogf函数来处理日志记录?是因为如果在那个时间流程中止,关闭可能会被遗漏吗?

1 个答案:

答案 0 :(得分:2)

最可能的解释是,由于Logger.Warn方法返回error值,因此重构为首先保存登录变量msg所需的值,然后单独记录它,并将其作为错误返回。 Logger.Info同时会在可能的情况下尽快记录消息,因为不需要返回消息。 这似乎是这些功能运作方式的唯一区别。