2 回答

TA貢獻(xiàn)1804條經(jīng)驗 獲得超7個贊
這是因為defer
語句僅defer
評估函數(shù)調(diào)用 - 并且函數(shù)調(diào)用在defer
執(zhí)行時評估。根據(jù)文檔:
每次執(zhí)行“defer”語句時,調(diào)用的函數(shù)值和參數(shù)都會照常評估并重新保存,但不會調(diào)用實際函數(shù)。相反,延遲函數(shù)會在周圍函數(shù)返回之前立即調(diào)用,調(diào)用順序與延遲函數(shù)相反。也就是說,如果周圍函數(shù)通過顯式 return 語句返回,則延遲函數(shù)將在該 return 語句設(shè)置任何結(jié)果參數(shù)之后但在函數(shù)返回到其調(diào)用者之前執(zhí)行。如果延遲函數(shù)值求值為 nil,則在調(diào)用該函數(shù)時(而不是執(zhí)行“defer”語句時)會發(fā)生執(zhí)行混亂。
您的代碼defer trace2()()
本質(zhì)上相當(dāng)于f := trace2(); defer f()
. 因此trace2
立即被評估(并因此被調(diào)用)。
因此,為了實現(xiàn)您可能想要的(跟蹤時間),您可以像這樣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貢獻(xiàn)1779條經(jīng)驗 獲得超6個贊
使用 defer 跟蹤時間的方法是將開始時間傳遞給 deferred 函數(shù):
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)
}
傳遞的參數(shù)會立即執(zhí)行,但實際的函數(shù)調(diào)用會推遲到最后。
如果您想更明確地了解執(zhí)行的內(nèi)容和延遲的內(nèi)容,可以將整個內(nèi)容包裝在一個函數(shù)中,以便確保內(nèi)部的所有內(nèi)容都在最后執(zhí)行
defer func() {
..... code ....
}()
- 2 回答
- 0 關(guān)注
- 138 瀏覽
添加回答
舉報