问题很简单,我有一个这样的日志:
glog.v(5).Infof("xxx %v", getLogContent())
但是我的getLogContent()
是耗时的方法,所以我想问:当我的程序不符合v(5)级别时,getLogContent()
是否已执行?
答案 0 :(得分:2)
是
如果您不希望getLogContent()
运行
if glog.V(5) {
glog.V(5).Infof("xxx %v", getLogContent())
}
Go计算所有参数,因此将调用getLogContent
,但如果未达到详细程度,则不会记录输出。
答案 1 :(得分:0)
我好奇并且玩弄这个。我不知道这对你有用,但有趣。
通过使用lambda函数,并创建一个实现Stringer
接口的函数类型,Go格式库将在需要打印时调用它。
我找不到一种我真正喜欢创建函数类型的方法,也许别人知道更好的技巧。
package main
import (
"fmt"
"os"
"time"
)
type thing func() string
func (t thing) String() string {
return t()
}
func toThing(f func() string) thing {
return f
}
func maybePrint(p bool, args ...interface{}) {
if p {
fmt.Println(args...)
}
}
func main() {
maybePrint(len(os.Args) > 2, "testing", toThing(func() string {
fmt.Println("Calculating big thing")
time.Sleep(time.Second)
return "test"
}))
}