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