Go 为什么这些函数相同的方法写得不同?
}Go 为什么这些函数相同的方法写得不同?,go,logging,Go,Logging,} 这两个函数来自log4go库的源代码,我不知道为什么Warn(实际上所有级别都高于Warn)与Info不同,为什么Warn函数先运行msg,而Info将所有参数传递给iniLogf函数来处理日志?这是因为如果进程在该时间中止,可能会忽略关闭吗?最可能的解释是,由于Logger.Warn方法返回一个错误值,它经过重构,首先保存需要登录到变量msg中的值,然后单独记录并作为错误返回。 Logger.Info,同时,尽可能快地记录消息,因为不需要返回消息。 这似乎是这些函数工作方式的唯一区别。我认
这两个函数来自log4go库的源代码,我不知道为什么Warn(实际上所有级别都高于Warn)与Info不同,为什么Warn函数先运行msg,而Info将所有参数传递给iniLogf函数来处理日志?这是因为如果进程在该时间中止,可能会忽略关闭吗?最可能的解释是,由于
Logger.Warn
方法返回一个错误值,它经过重构,首先保存需要登录到变量msg
中的值,然后单独记录并作为错误返回。
Logger.Info
,同时,尽可能快地记录消息,因为不需要返回消息。
这似乎是这些函数工作方式的唯一区别。我认为这是第三方库代码的一个非常详细的部分。也许你应该问问图书馆的作者。是的。。。我犯了一个愚蠢的错误。。。我没有看到返回错误。New()。。。好的,无论如何,谢谢你。。
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...)
}