Defer 语句在执行关联函数之前等待函数完成。但是,使用 defer 打印以下函数的执行时间始终为零:
func sum() { start := time.Now() // Expected non-zero value, but always gets 0 defer fmt.Println(time.Now().Sub(start)) sum := 0 for i := 1; i < 101; i++ { sum += i } time.Sleep(1 * time.Second) fmt.Println(sum) }
问题:
defer 在包含函数延迟时计算延迟函数的参数。因此,在循环或睡眠之前立即评估 start。
解决方案:
要准确测量经过的时间,请在延迟函数内评估 time.Now():
defer func() { fmt.Println(time.Now().Sub(start)) }()
这样做可以在延迟函数执行时计算时间差,确保结果准确。
提示:考虑使用可重用的函数来封装时序逻辑测量更简单、更一致。
以上是为什么在 Go 中使用 Defer 测量执行时间总是产生零?的详细内容。更多信息请关注PHP中文网其他相关文章!