第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么當(dāng) annoymouse 函數(shù)返回時 defer 語句的工作方式不同

為什么當(dāng) annoymouse 函數(shù)返回時 defer 語句的工作方式不同

Go
慕哥9229398 2023-08-07 14:54:06
這里我聲明了一個推遲trace1的函數(shù)func TestDeferFunc(t *testing.T) {    fmt.Println("start", time.Now())    defer trace1()    time.Sleep(3 * time.Second)}func trace1() {    startTime := time.Now()    fmt.Println("end time: ", startTime)    fmt.Println("execute time: ", time.Since(startTime))}運行后go test -run=^TestDeferFunc$,下面是我得到的start 2019-11-26 12:50:59.59489797 +0800 CST m=+0.000202866end time:  2019-11-26 12:51:02.595090951 +0800 CST m=+3.000395880execute time:  49.065μs然而,當(dāng)我推遲另一個 annoymouse 函數(shù)時,事情發(fā)生了變化func TestDeferFunc(t *testing.T) {    fmt.Println("start", time.Now())    defer trace2()()    time.Sleep(3 * time.Second)}func trace2() func() {    startTime := time.Now()    fmt.Println("end time: ", startTime)    fmt.Println("execute time: ", time.Since(startTime))    return func() {        fmt.Println("zzz")    }}下面是go test結(jié)果start 2019-11-26 12:52:58.318472958 +0800 CST m=+0.000197852end time:  2019-11-26 12:52:58.318554368 +0800 CST m=+0.000279262execute time:  4.853μszzz有人可以幫我嗎!謝謝
查看完整描述

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))

    }

}


查看完整回答
反對 回復(fù) 2023-08-07
?
哆啦的時光機

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 ....

}()


查看完整回答
反對 回復(fù) 2023-08-07
  • 2 回答
  • 0 關(guān)注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號