Go語言defer學習小結

2021-07-27 10:29:24 字數 952 閱讀 6918

延時呼叫函式語法:

defer func_name(param-list)

defer func()()

關鍵字defer修飾的函式,值得關注的有以下幾點:

1、函式會被推遲到包含這個defer語句的函式即將返回前才被呼叫執行。

這點需要理解defer的工作機制,大致為defer出現的地方,插入指令call runtime.deferproc,然後再函式返回之前的地方,插入指令call runtime.deferreturn。

最關鍵的是:函式執行的return語句不是原子操作。

return的過程是先在棧中寫乙個值,這個值會被當做返回值,然後再呼叫ret指令,彙編後具體可分為(賦值指令 + ret指令)。

當return前插入defer,彙編後具體可分為(賦值指令 + call defer指令 + ret指令)。

也就是說:defer函式呼叫的執行時機是外層函式設定返回值之後,並且在即將返回之前。

func test_1()(r int)()

return t

}轉換後func test_1()(r int)()

return

}

返回值為1,而不是2。

2、defer呼叫的函式引數值,在defer定義時確定,而defer函式內部使用的值需要在這個函式執行時才確定。

具體可以根據兩個簡單的**來理解。

func test_1()(i)

defer func()()

i++return

}

可以看到,defer呼叫的函式引數的入參,在defer定義時就被確定,但是內部所使用的值確是在執行時才確定。

3、函式丟擲異常,defer函式也會被執行,如此就不會因為程式出錯而導致資源不被釋放。

go語言 defer 高階

go語言defer語句的用法 defer後面必須是函式呼叫語句,不能是其他語句,否則編譯器會出錯。package main import log func foo n int int func main 這個例子中defer後面使用的是n 指令,不是乙個函式呼叫語句,編譯器就報錯 command l...

go語言 defer 高階

go語言defer語句的用法 defer後面必須是函式呼叫語句,不能是其他語句,否則編譯器會出錯。package main import log func foo n int int func main 這個例子中defer後面使用的是n 指令,不是乙個函式呼叫語句,編譯器就報錯 command l...

Go基礎學習 defer

defer延遲函式總是在異常panic或者正常return前返回 defer執行順序按照先入後出的原則,即先入棧的最後執行 但是會先把引數壓入棧,具體執行會在函式結束前 當defer函式中存在函式時會先執行裡面的函式 defer函式呼叫的引數當存在閉包時,會從外面拿取該引數的最新的值 defer常常...