在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

clipboard.png

結果:
4 5 6
1 2 3

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

回答
編輯回答
氕氘氚

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

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

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

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