2 回答

TA貢獻1804條經驗 獲得超7個贊
這是因為defer
語句僅defer
評估函數調用 - 并且函數調用在defer
執行時評估。根據文檔:
每次執行“defer”語句時,調用的函數值和參數都會照常評估并重新保存,但不會調用實際函數。相反,延遲函數會在周圍函數返回之前立即調用,調用順序與延遲函數相反。也就是說,如果周圍函數通過顯式 return 語句返回,則延遲函數將在該 return 語句設置任何結果參數之后但在函數返回到其調用者之前執行。如果延遲函數值求值為 nil,則在調用該函數時(而不是執行“defer”語句時)會發生執行混亂。
您的代碼defer trace2()()
本質上相當于f := trace2(); defer f()
. 因此trace2
立即被評估(并因此被調用)。
因此,為了實現您可能想要的(跟蹤時間),您可以像這樣defer trace3()()
使用:trace3()
func trace3() func() {
startTime := time.Now()
return func() {
fmt.Println("end time: ", time.Now())
fmt.Println("execute time: ", time.Since(startTime))
}
}

TA貢獻1779條經驗 獲得超6個贊
使用 defer 跟蹤時間的方法是將開始時間傳遞給 deferred 函數:
func trace1(startTime time.Time) {
fmt.Println("start", startTime)
fmt.Println("end time: ", time.Now())
fmt.Println("execute time: ", time.Since(startTime))
}
func TestDeferFunc(t *testing.T) {
defer trace1(time.Now())
time.Sleep(3 * time.Second)
}
傳遞的參數會立即執行,但實際的函數調用會推遲到最后。
如果您想更明確地了解執行的內容和延遲的內容,可以將整個內容包裝在一個函數中,以便確保內部的所有內容都在最后執行
defer func() {
..... code ....
}()
- 2 回答
- 0 關注
- 141 瀏覽
添加回答
舉報