兄弟連go教程(15)函式 - 延遲呼叫
關鍵字 defer ⽤用於註冊延遲調⽤用。這些調⽤用直到 ret 前才被執⾏行,通常⽤用於釋放資源或錯
誤處理。
多個 defer 註冊,按 FILO 次序執⾏行。哪怕函式或某個延遲調⽤用發⽣生錯誤,這些調⽤用依舊
會被執⾏行。
輸出:
延遲調⽤用引數在註冊時求值或複製,可⽤用指標或閉包 "延遲" 讀取。
輸出:
濫⽤用 defer 可能會導致效能問題,尤其是在⼀一個 "⼤大迴圈" ⾥裡。
輸出:
誤處理。
func test() error {
f, err := os.Create("test.txt")
if err != nil { return err }
defer f.Close() // 註冊調⽤用,⽽而不是註冊函式。必須提供引數,哪怕為空。
f.WriteString("Hello, World!")
return nil
}
多個 defer 註冊,按 FILO 次序執⾏行。哪怕函式或某個延遲調⽤用發⽣生錯誤,這些調⽤用依舊
會被執⾏行。
func test(x int) {
defer println("a")
defer println("b")
defer func() {
println(100 / x) // div0 異常未被捕獲,逐步往外傳遞,最終終⽌止程式。
}()
defer println("c")
}
func main() {
test(0)
}
輸出:
c
b
a
panic: runtime error: integer divide by zero
延遲調⽤用引數在註冊時求值或複製,可⽤用指標或閉包 "延遲" 讀取。
func test() {
x, y := 10, 20
defer func(i int) {
println("defer:", i, y) // y 閉包引⽤用
}(x) // x 被複制
x += 10
y += 100
println("x =", x, "y =", y)
}
輸出:
x = 20 y = 120
defer: 10 120
濫⽤用 defer 可能會導致效能問題,尤其是在⼀一個 "⼤大迴圈" ⾥裡。
var lock sync.Mutex
func test() {
lock.Lock()
lock.Unlock()
}
func testdefer() {
lock.Lock()
defer lock.Unlock()
}
func BenchmarkTest(b *testing.B) {
for i := 0; i < b.N; i++ {
test()
}
}
func BenchmarkTestDefer(b *testing.B) {
for i := 0; i < b.N; i++ {
testdefer()
}
}
輸出:
BenchmarkTest? 50000000 43 ns/op
BenchmarkTestDefer 20000000 128 ns/op
尹成老師
QQ77025077
微信18510341407
所有視訊在尹成學院
www.yinchengxueyuan.com
尹成百度雲請聯絡QQ475318423
相關文章
- 兄弟連go教程(15)函式 - 錯誤處理Go函式
- 兄弟連go教程(14)函式 - 匿名函式Go函式
- 兄弟連go教程(11)函式 - 函式定義Go函式
- 兄弟連go教程(12)函式 - 變參Go函式
- 兄弟連go教程(13)函式 返回值Go函式
- 兄弟連go教程(10)表示式 - 控制流Go
- 兄弟連go教程(9)表示式-初始化Go
- 兄弟連go教程(5)字串Go字串
- 兄弟連go教程(8)表示式--保留字;運算子Go
- 兄弟連go教程(6)指標Go指標
- 兄弟連go教程(2)型別-常量Go型別
- 兄弟連go教程(3)基本型別Go型別
- 兄弟連go教程(16)資料 - ArrayGo
- 兄弟連go教程(17)資料 - SliceGo
- 兄弟連go教程(18)資料 - MapGo
- 兄弟連go教程(19)資料 -StructGoStruct
- 兄弟連go教程(1)型別-變數Go型別變數
- 兄弟連go教程(7)自定義型別Go型別
- go 學習筆記之解讀什麼是defer延遲函式Go筆記函式
- 兄弟連go教程(19)資料 - 匿名欄位Go
- 兄弟連go教程(19)資料 - ⾯物件導向Go物件
- 兄弟連go教程(4)型別-引用及轉換Go型別
- go 學習筆記之咬文嚼字帶你弄清楚什麼是 defer延遲函式Go筆記函式
- 基於rabbitmq延遲外掛實現分散式延遲任務MQ分散式
- 實現簡單延遲佇列和分散式延遲佇列佇列分散式
- C++入門教程(11):呼叫函式C++函式
- 延時函式函式
- 像跟蹤分散式服務呼叫那樣跟蹤 Go 函式呼叫鏈分散式Go函式
- Mysql 常用函式(15)- upper 函式MySql函式
- PHP vs Go,為什麼 Go 不支援命名引數呼叫函式?PHPGo函式
- 為什麼 Go 裡值為 nil 可以呼叫函式?Go函式
- 好程式設計師Python教程系列遞迴函式與匿名函式呼叫程式設計師Python遞迴函式
- 函式呼叫棧函式
- 子函式呼叫函式
- 基於Dynomite的分散式延遲佇列MIT分散式佇列
- RabbitMQ延遲訊息的延遲極限是多少?MQ
- java呼叫python簡單函式介面的具體教程JavaPython函式
- laravel佇列實戰詳細記錄,含demo(任務鏈呼叫,延遲呼叫)Laravel佇列