在 Go 中,defer 语句允许您推迟函数的执行,直到周围的函数返回。但是,当尝试使用 defer 打印函数的执行时间时,它可能会返回 0。让我们检查一下此行为及其解决方案。
考虑以下代码片段:
func sum() { start := time.Now() //expecting to print 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) }
即使休眠了一秒,延迟时间差计算总是打印 0。为什么会发生这种情况?
出现这个问题是因为延迟函数的参数在函数延迟时进行评估。当延迟函数执行时,周围的函数已经返回,并且 start 变量超出了范围。
为了解决这个问题,我们可以创建一个捕获 start 的当前值的闭包。更正后的代码如下:
func sum() { start := time.Now() // Create a closure that captures the current value of start defer func() { fmt.Println(time.Now().Sub(start)) }() sum := 0 for i := 1; i < 101; i++ { sum += i } time.Sleep(1 * time.Second) fmt.Println(sum) }
将时序逻辑封装在单独的函数中也可以提高代码的复用性。
以上是为什么在尝试测量函数执行时间时,在 Go 中延迟时间差计算会返回 0?的详细内容。更多信息请关注PHP中文网其他相关文章!