defer的詞義:「延遲」,「推遲」
在go語言中,defer關鍵字來延遲乙個函式或者方法的執行
1.defer函式或方法:乙個函式或方法的執行被延遲了
2.defer的用法:
a:物件.close(),臨時檔案的刪除。。。
檔案.open()
defer close()
讀或寫b:go語言中關於異常的處理,使用panic()和recover()
panic函式用於引發恐慌,導致程式中斷執行
recover函式用於恢復程式的執行,recover()語法要求必須在defer中執行
3.如果多個defer函式:
棧規則,先延遲後執行,後延遲先執行
4.defer函式傳遞引數的時候:
defer函式呼叫時,就已經傳遞了引數資料了,只是暫時不執行函式中的**而已
5.defer函式注意點:
當外圍函式的語句正常執行完畢時,只有其中所有的延遲函式都執行完畢,外圍函式才會真正的結束執行。
當執行外圍函式中的return語句時,只有其中所有的延遲函式都執行完畢後,外圍函式才會真正返回
當外圍函式中的**引發執行恐慌時,只有其中所有的延遲含稅都執行完畢後,該執行時恐慌才會真正被擴充套件至呼叫函式
package main
import
"fmt"
func
main()
func
fun1
(s string
)func
fun2
(a int
)func
fun3()
int
輸出:
hello
123456
----
----
----
----
----
----
-----2
main中列印的a=3==
====
====
====
====
====
====
====
====
fun3
()函式的執行。。。
hahaha
0fun2
()函式列印的a=
2world
defer與return的注意點:
(1):無參返回值
package main
import
("fmt"
)funca(
)int()
defer
func()
()return i
}func
main()
輸出:
defer1:
1defer2:
2return
:0
解釋:
返回值由變數i賦值,相當於返回值為i=0。第二個defer中i++ = 1, 第乙個defer中i++ = 2,所以最終i的值是2。但是返回值已經被賦值了,就算後續修改i也不會影響返回值。最終返回值返回0,所以main中列印0。(2)有參返回值
package main
import
("fmt"
)funcb(
)(i int)(
)defer
func()
()return i //或者直接寫成return
}func
main()
輸出:
defer1:
1defer2:
2return
:2
解釋:
這裡已經指定了返回值就是i,所以對i進行修改都相當於在修改返回值,所以最終函式的返回值是2。
GO語言延遲函式defer用法分析
defer 在宣告時不會立即執行,而是在函式 return 後,再按照 filo 先進後出 的原則依次執行每乙個 defer,一般用於異常處理 釋放資源 清理資料 記錄日誌等。這有點像物件導向語言的析構函式,優雅又簡潔,是 golang 的亮點之一。1 了解 defer 的執行順序 package ...
go語言defer關鍵字的用法
在 go 中,defer語句會推遲函式 包括任何引數 的執行,直到包含defer語句的函式完成。通常情況下,當你想要避免忘記任務 例如關閉檔案或執行清理程序 時,可以推遲某個函式的執行。可以根據需要推遲任意多個函式。defer 語句按逆序執行,先執行最後乙個,最後執行第乙個。通過執行以下示例 來檢視...
go語言 defer 高階
go語言defer語句的用法 defer後面必須是函式呼叫語句,不能是其他語句,否則編譯器會出錯。package main import log func foo n int int func main 這個例子中defer後面使用的是n 指令,不是乙個函式呼叫語句,編譯器就報錯 command l...