大家都知道go語言的defer功能很強大,對於資源管理非常方便,但是如果沒用好,也會有陷阱哦。go 語言中延遲函式 defer 充當著 try...catch 的重任,使用起來也非常簡便,然而在實際應用中,很多 gopher 並沒有真正搞明白 defer、return、返回值、panic 之間的執行順序,從而掉進坑中,今天我們就來揭開它的神秘面紗!話不多說了,來一起看看詳細的介紹吧。
延時呼叫函式的語法如下:
defer func_name(param-list)當乙個函式呼叫前有關鍵字defer時, 那麼這個函式的執行會推遲到包含這個 defer 語句的函式即將返回前才執行. 例如:
package main執行結果import (
"fmt"
)func main()
小結:defer 呼叫的函式引數的值 defer 被定義時就確定了
案例2
package main在 "defer fmt.println("deferred print:", i)" 呼叫時, i 的值已經確定了, 因此相當於 defer fmt.println("deferred print:", 1)了
小結:需要強調的時, defer 呼叫的函式引數的值在 defer 定義時就確定了, 而 defer 函式內部所使用的變數的值需要在這個函式執行時才確定
案例3
package main小結:上面的例子中, 最終列印的內容是 "3", 這是因為在 "r = 2" 賦值之後, 執行了 defer 函式, 因此在這個函式內, r 的值是2了, 自增後變為3
函式定義
func function_name( [parameter list] ) [return_types]或者func funcname(形參1 type[, 形參2 type...]) [([[返回變數1] type[, [返回變數2] type...]])]如果有多個defer 呼叫, 則呼叫的順序是先進後出的順序, 類似於入棧出棧一樣(後進先出/先進後出)案例4
package main上面fmt.println(f1())列印的是什麼呢? 很多朋友可能會認為列印的是0, 但是正確答案是 1. 這是為什麼呢?import "fmt"
func f3() (r int) ()
return 0
}func main()
要弄明白這個問題, 我們需要牢記兩點:
案例5
參考1、golang defer 使用小結與注意要點
2、go語言中的延遲函式defer示例詳解
Golang入門教程(十五)指標
指標是乙個變數,用於儲存另乙個變數的記憶體位址。在上面的例子中,變數b的值是156,儲存在記憶體位址0x1040a124。變數a包含b的位址。可以說現在a指向b。指向型別t的指標用 t表示 讓我們寫一些 package main import fmt func main 運算子用於獲取變數的位址。在...
Golang入門教程(十五)指標
指標是乙個變數,用於儲存另乙個變數的記憶體位址。在上面的例子中,變數b的值是156,儲存在記憶體位址0x1040a124。變數a包含b的位址。可以說現在a指向b。指向型別t的指標用 t表示 讓我們寫一些 package main import fmt func main 運算子用於獲取變數的位址。在...
SDL入門教程(十三) 2 初識多執行緒
intmain intargc char argv if gameevent.type sdl keydown screen.flip sdl killthread thread1 sdl killthread thread2 return0 void sdl delay uint32 ms 解決r...