cmd/vet: time.Since should not be used in defer statement
如 go vet中的那些检测项 13. defers中介绍
report common mistakes in defer statements
当 defer 语句导致非延迟调用 time 时,defer 分析器会报告诊断。因为,经验表明这几乎总是一个错误。 例如:
即
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package main
import ( "fmt" "time" )
func main() {
start := time.Now() fmt.Println("当前时间:", start)
defer recordLatency(time.Since(start))
time.Sleep(3 * time.Second)
}
func recordLatency(duration time.Duration) {
fmt.Println("共耗时:", duration)
}
|
输出并不是预期的3s多,而是200多µs
这是因为time.Since会立刻计算,不会等defer执行时才算
上面这段代码,加defer和不加defer效果一样
正确的写法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package main
import ( "fmt" "time" )
func main() {
start := time.Now() fmt.Println("当前时间:", start)
defer func() { recordLatency(time.Since(start)) }()
time.Sleep(3 * time.Second)
}
func recordLatency(duration time.Duration) {
fmt.Println("共耗时:", duration)
}
|
输出:
1 2
| 当前时间: 2023-07-25 16:44:26.90604 +0800 CST m=+0.000169751 共耗时: 3.001356959s
|
原文链接: https://dashen.tech/2020/10/29/Go新提案-go-vet新增检测项-当在defer后直接使用time-Since时给出提示/
版权声明: 转载请注明出处.