鍍金池/ 問答/GO  HTML/ Go defer的實現(xiàn)機(jī)制到底怎么回事???

Go defer的實現(xiàn)機(jī)制到底怎么回事???

clipboard.png

結(jié)果:
4 5 6
1 2 3

問:我開始的理解是函數(shù)執(zhí)行到非defer語句的最后一行才去執(zhí)行defer語句,那么當(dāng)函數(shù)執(zhí)行完后a,b,c的值應(yīng)該已經(jīng)被更新到4,5,6了,那么此時再執(zhí)行defer語句時應(yīng)該傳入a,b,c最新的值,也就是兩次輸出:4,5,6。但從結(jié)果看來,我只能猜測是:執(zhí)行到defer語句時,系統(tǒng)會把當(dāng)時環(huán)境的a,b,c的值壓入“棧”中,所以不是等到函數(shù)非defer語句執(zhí)行完才去獲取abc最新值當(dāng)參數(shù)傳入foo。 那么defer后面的機(jī)制到底是怎么去實現(xiàn)的呢? 官方網(wǎng)上不去,有誰能說說它的原理或者有官方的說法鏈接給發(fā)一個唄.

回答
編輯回答
氕氘氚

太感謝@勤奮的小小塵,完全解決了心中的疑慮,果然如此。我這的VPN用不了了,某度又找不準(zhǔn)想要的。真是千恩萬謝

2017年1月29日 15:23
編輯回答
亮瞎她

官網(wǎng)blog 有對defer, panic, and recover的詳細(xì)說法,不知道你能不能打開

https://blog.golang.org/defer...

摘錄一下
A defer statement pushes a function call onto a list. The list of saved calls is executed after the surrounding function returns. Defer is commonly used to simplify functions that perform various clean-up actions.

The behavior of defer statements is straightforward and predictable. There are three simple rules:

1. A deferred function's arguments are evaluated when the defer statement is evaluated.

In this example, the expression "i" is evaluated when the Println call is deferred. The deferred call will print "0" after the function returns.

func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}

2. Deferred function calls are executed in Last In First Out order after the surrounding function returns.

This function prints "3210":

func b() {
    for i := 0; i < 4; i++ {
        defer fmt.Print(i)
    }
}

3. Deferred functions may read and assign to the returning function's named return values.

In this example, a deferred function increments the return value i after the surrounding function returns. Thus, this function returns 2:

func c() (i int) {
    defer func() { i++ }()
    return 1
}

希望你能理解

2018年7月3日 18:30