Defer 語句在執行關聯函數之前等待函數完成。但是,使用 defer 列印以下函數的執行時間始終為零:
func sum() { start := time.Now() // Expected 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) }
問題:
defer 在包含函數延遲時計算延遲函數的參數。因此,在循環或睡眠之前立即評估 start。
解:
要準確測量經過的時間,請在延遲函數內評估time.Now():
defer func() { fmt.Println(time.Now().Sub(start)) }()
這樣做可以在延遲函數執行時計算時間差,保證準確結果。
提示:考慮使用可重複使用函數來封裝時序邏輯,以便更輕鬆、更一致的測量。
以上是為什麼在 Go 中使用 Defer 測量執行時間總是產生零?的詳細內容。更多資訊請關注PHP中文網其他相關文章!