日常工作中可能需要记录一次调用的耗时,如下
func handler(a, b int) string {
t0 := time.Now()
if a > b {
time.Sleep(100 * time.Millisecond)
fmt.Printf("1. use time %d ms\n",time.Since(t0).Milliseconds())
return "ok"
} else {
time.Sleep(200 * time.Millisecond)
fmt.Printf("2. use time %d ms\n",time.Since(t0).Milliseconds())
return "ok"
}
}
func main(){
handler(3,4)
}
运行结果
2. use time 203 ms
诚然,上面的代码能实现需求,但是实现方式很不优雅,计算耗时的代码散落各处,那么有没有更好的方式呢?当然有,用golang
的defer
即可,如下代码
func handler1(a, b int) string {
t0 := time.Now()
defer fmt.Printf("1. use time %d ms\n",time.Since(t0).Milliseconds())
if a > b {
time.Sleep(100 * time.Millisecond)
return "ok"
} else {
time.Sleep(200 * time.Millisecond)
return "ok"
}
}
func main(){
handler(3,4)
}
运行结果
use time 0 ms
为什么会是0
毫秒呢?原因是defer
在注册的时候就把使用到的相关计算表达式计算好了,在最后不过是打印输出而已。
那么应该如何做呢?使用闭包即可,即使用匿名函数的方式,defer
后面如果跟的是匿名函数,则是会在defer
实际运行的时候,才会去计算匿名函数中的相关表达式,如下
func handler2(a, b int) string {
t0 := time.Now()
defer func() {
fmt.Printf("use time %d ms\n",time.Since(t0).Milliseconds())
}()
if a > b {
time.Sleep(100 * time.Millisecond)
return "ok"
} else {
time.Sleep(200 * time.Millisecond)
return "ok"
}
}
func main(){
handler2(3,4)
}
运行结果
use time 203 ms