首頁  >  文章  >  後端開發  >  為什麼測量 Go 中的延遲函數執行時間會回傳意外結果?

為什麼測量 Go 中的延遲函數執行時間會回傳意外結果?

Barbara Streisand
Barbara Streisand原創
2024-11-20 11:47:51815瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn