Go新提案:go vet新增检测项,当在defer后直接使用time.Since时给出提示

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

// start := time.Now()
// ...
// defer recordLatency(time.Since(start)) // error: call to time.Since is not deferred
//
// The correct code is:
//
// defer func() { recordLatency(time.Since(start)) }()

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

文章目录