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

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

如何理解這個(gè)遞歸結(jié)果

如何理解這個(gè)遞歸結(jié)果

Go
互換的青春 2023-06-01 14:58:36
我在編碼時(shí)寫(xiě)了一個(gè)錯(cuò)誤,當(dāng)我解決這個(gè)問(wèn)題時(shí),我對(duì)代碼的輸出感到困惑,代碼如下所示:type (    Handler func(name string) error)func mh(h Handler) Handler {    return func(name string) error {        fmt.Printf("return mh,name=%s,h=%x\n", name, h)        return h(name)    }}func main() {    var h Handler    h = func(name string) error {        fmt.Printf("********************************\n")        fmt.Printf("before func h=%x\n", h)        h = mh(h)        fmt.Printf("after func h=%x\n", h)        return h(name)    }    fmt.Printf("main h=%x\n", h)    h("main")}運(yùn)行代碼,輸出為:main h=486d40********************************before func h=486d40after func h=486c00return mh,name=main,h=486d40********************************before func h=486c00after func h=486c00return mh,name=main,h=486c00return mh,name=main,h=486d40********************************before func h=486c00after func h=486c00return mh,name=main,h=486c00return mh,name=main,h=486c00return mh,name=main,h=486d40.......我不明白調(diào)用堆棧。我認(rèn)為輸出應(yīng)該是循環(huán)“mh”。
查看完整描述

2 回答

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

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊

要理解的關(guān)鍵是這一行:

h = mh(h)

調(diào)用函數(shù)h。它調(diào)用mh()函數(shù),該函數(shù)只返回一個(gè)函數(shù)值,但它不調(diào)用h()任何一個(gè)。如果將調(diào)用返回的函數(shù)值,那將調(diào)用h().

所以該main()函數(shù)將一個(gè)函數(shù)值存儲(chǔ)在 中h,然后調(diào)用h()。

h()將打印"before",然后包裝 h在另一個(gè)函數(shù)中,并將結(jié)果存儲(chǔ)在h,然后打印"after"。重要的是要知道包裝函數(shù)(由 返回的值mh())是一個(gè)閉包,它存儲(chǔ)了 的原始值h,因此將結(jié)果分配給h不會(huì)影響h包裝函數(shù)內(nèi)部。

所以h通過(guò)調(diào)用h現(xiàn)在是包裝函數(shù)來(lái)結(jié)束。包裝函數(shù)從打印開(kāi)始"return",然后調(diào)用原始的未包裝函數(shù)h。

原始的,h再次展開(kāi)打印"before",然后它包裝當(dāng)前值h(這是包裝函數(shù)),將其存儲(chǔ)在中h,然后打印"after"。

然后調(diào)用h,它現(xiàn)在是一個(gè) 2 次包裝函數(shù)。它從打印開(kāi)始"return",然后調(diào)用保存的h值,這是一個(gè) 1 次包裝函數(shù)。1 次包裝函數(shù)從"return"(再次)打印開(kāi)始,然后繼續(xù)原始函數(shù),打印"before", wrapsh現(xiàn)在將被 3 次包裝,將其存儲(chǔ)在 中h,然后調(diào)用h(這是 3 次包裝函數(shù)值) ...

如此邏輯下去,存儲(chǔ)的函數(shù)值h會(huì)越來(lái)越wrapped,被wrapped的函數(shù)總是有一個(gè)少一次wrapped previous function的保存值。

隨著“迭代”的繼續(xù),“包裝深度”增加,因此您會(huì)看到越來(lái)越多的"return"語(yǔ)句被打?。ㄒ?yàn)檫@就是包裝的作用)。


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊

罪魁禍?zhǔn)资沁@個(gè)任務(wù):

  h = mh(h)

它取代了在任何返回之前/之后打印出的匿名函數(shù)中的hin的綁定。mainmh

如果你更換

    h = mh(h)    
    fmt.Printf("after func h=%x\n", h)    
    return h(name)

    return mh(h)(name)

你會(huì)得到你期望的相互遞歸


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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