延時呼叫函式語法:
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常常...