2 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
'part 2' 閉包捕獲變量 'i'。當(dāng)閉包中的代碼(稍后)執(zhí)行時(shí),變量 'i' 具有它在 range 語(yǔ)句的最后一次迭代中的值,即。'4'。因此
4 4 4 4 4
輸出的一部分。
“第 3 部分”在其閉包中沒有捕獲任何外部變量。正如規(guī)格所說(shuō):
每次執(zhí)行“defer”語(yǔ)句時(shí),函數(shù)值和調(diào)用的參數(shù)都會(huì)像往常一樣評(píng)估并重新保存,但不會(huì)調(diào)用實(shí)際的函數(shù)。
所以每個(gè)延遲的函數(shù)調(diào)用都有不同的“n”參數(shù)值。它是執(zhí)行 defer 語(yǔ)句時(shí) 'i' 變量的值。因此
4 3 2 1 0
輸出的一部分,因?yàn)椋?/p>
...在周圍函數(shù)返回之前立即以 LIFO 順序執(zhí)行延遲調(diào)用 ...
需要注意的關(guān)鍵點(diǎn)是在 defer 語(yǔ)句執(zhí)行時(shí)沒有執(zhí)行'defer f()' 中的 'f()'
但
'defer f(e)' 中的表達(dá)式 'e' 在defer 語(yǔ)句執(zhí)行時(shí)被計(jì)算。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
為了加深對(duì) 的理解,我想再舉一個(gè)例子,defer mechanish先按原樣運(yùn)行這個(gè)代碼段,然后切換標(biāo)記為 (A) 和 (B) 的語(yǔ)句的順序,然后自己看看結(jié)果。
package main
import (
"fmt"
)
type Component struct {
val int
}
func (c Component) method() {
fmt.Println(c.val)
}
func main() {
c := Component{}
defer c.method() // statement (A)
c.val = 2 // statement (B)
}
我一直想知道在這里應(yīng)用什么是正確的關(guān)鍵字或概念??雌饋?lái)表達(dá)式c.method已被評(píng)估,從而返回一個(gè)綁定到組件“c”實(shí)際狀態(tài)的函數(shù)(例如獲取組件內(nèi)部狀態(tài)的快照)。我想答案不僅涉及defer mechanish如何funtions with value or pointer receiver工作。請(qǐng)注意,如果您將 func 命名method為 a ,則也會(huì)發(fā)生這種情況,pointer receiverdefer 會(huì)將 c.val 打印為 2,而不是 0。
- 2 回答
- 0 關(guān)注
- 262 瀏覽
添加回答
舉報(bào)