1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
在延遲函數(shù)中,您有機(jī)會修改結(jié)果參數(shù)的值。
調(diào)用延遲函數(shù)時(shí),return
語句中指定的值已經(jīng)設(shè)置。
如果有多個(gè)延遲函數(shù),它們會按 LIFO 順序(后進(jìn)先出)執(zhí)行。
在您的第二個(gè)示例中,fmt.Println()
首先執(zhí)行,然后是另一個(gè)匿名函數(shù)。
但是你需要知道的是,當(dāng)defer
語句執(zhí)行時(shí),延遲函數(shù)的參數(shù)會立即計(jì)算,而不是在延遲函數(shù)運(yùn)行時(shí)(稍后,在返回之前)。
每次執(zhí)行“defer”語句時(shí),函數(shù)值和調(diào)用的參數(shù)都會像往常一樣評估并重新保存,但不會調(diào)用實(shí)際的函數(shù)。相反,在周圍函數(shù)返回之前立即調(diào)用延遲函數(shù),以與延遲相反的順序調(diào)用。
所以這一行:
defer fmt.Println("our i is", i)
總是意味著fmt.Println()
用i = 0
參數(shù)調(diào)用:
fmt.Println("our i is", 0)
因?yàn)楫?dāng)這條線運(yùn)行時(shí),i
它的值為0
。
因此,在您的第二個(gè)示例中fmt.Println()
prints 0
,然后運(yùn)行另一個(gè)設(shè)置i
為的延遲函數(shù),1
這就是返回的內(nèi)容。
您的第一個(gè)示例只是打印一些內(nèi)容 ( i = 0
),但第一個(gè)示例中的延遲函數(shù)不會修改的值,i
因此45
將返回(并由 中的fmt.Println()
函數(shù)打印main()
)。
- 1 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報(bào)