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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

Go
慕哥9229398 2023-08-07 14:54:06
這里我聲明了一個(gè)推遲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))}運(yùn)行后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)我推遲另一個(gè) annoymouse 函數(shù)時(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 回答

?
三國(guó)紛爭(zhēng)

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

    }

}


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

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

}()


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號(hào)

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