Go 中使用延迟函数测量函数执行时间
在 Go 中,延迟函数提供了一种方便的机制来延迟函数的执行,直到周围的函数返回。但是,打印执行延迟函数所需的时间有时会返回意外结果。
问题:
考虑以下尝试计算执行时间的 sum() 函数使用延迟函数:
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 的当前值并推迟该匿名函数的执行:
defer func() { fmt.Println(time.Now().Sub(start)) }()
通过使用匿名函数,start 的值在延迟执行时计算函数被执行。
进一步注意事项:
如果您需要更多自定义或灵活性,请考虑将时序逻辑封装在可重用函数中。这种方法提供了更加模块化和可重用的解决方案。
以上是为什么测量 Go 中的延迟函数执行时间会返回意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!