Go 語言函數中的defer
在 Go 語言中的?defer?關鍵字就是 Go 語言中延遲語句的標志。Go 語言會在函數即將返回時按逆序執行?defer?后的語句。也就是說先被?defer?的語句后執行,最先執行最后被?defer?的語句。defer?和有些語言中的 finally 語句塊的用法類似,一般都用于釋放一些資源,最常用的地方就是進程鎖的釋放。
Tips:關于 defer 的進程鎖的釋放在 Go 語言的多線程中會有介紹。
1. defer 的逆序執行
defer?會在函數即將結束的時候執行,而且是按照?defer?的順序逆序執行。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import "fmt"
- 4
- 5?
func main() {
- 6? ? ? ? ?
defer fmt.Println("第一個defer的語句")
- 7? ? ? ? ?
defer fmt.Println("第二個defer的語句")
- 8? ? ? ? ?
defer fmt.Println("第三個defer的語句")
- 9? ? ? ? ?
fmt.Println("Hello Codey!")
- 10?
}
- 第 6 行:第一個?defer?的語句,最后一個執行;
- 第 7 行:第二個?defer?的語句,第二個執行;
- 第 8 行:第一個?defer?的語句,最后一個執行。
執行結果:
2. defer 中的變量
defer?關鍵字之后若有變量,則?defer?記錄的是在?defer?時的變量值,而不是最后函數結束時的變量值。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import "fmt"
- 4
- 5?
func main() {
- 6? ? ? ? ?
a := 10
- 7? ? ? ? ?
defer fmt.Println("defer時a的值為", a)
- 8? ? ? ? ?
a = 100
- 9? ? ? ? ?
fmt.Println("print時a的值為", a)
- 10?
}
- 第 7 行:此時變量 a 的值為 10,所以?defer?輸出時a的值為10;
- 第 8 行:此時變量 a 的值為 100,所以輸出時 a 的值為100。
執行結果:
3. 小結
本文主要介紹了 Go 語言中?defer?的使用,需要注意以下幾點:
- defer?是先聲明后執行的語句模式;
- defer?會在函數即將結束的時候統一執行;
- defer?中的變量值不會被?defer?之后的語句改變。
文章來源于網絡,侵刪!