2 回答

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