首页 > 后端开发 > Golang > 为什么测量 Go 中的延迟函数执行时间会返回意外结果?

为什么测量 Go 中的延迟函数执行时间会返回意外结果?

Barbara Streisand
发布: 2024-11-20 11:47:51
原创
862 人浏览过

Why Does Measuring Deferred Function Execution Time in Go Return Unexpected Results?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板