Golang入門教程(十三)延遲函式defer詳解

2021-08-22 12:17:24 字數 1956 閱讀 8556

大家都知道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

import "fmt"

func f3() (r int) ()

return 0

}func main()

上面fmt.println(f1())列印的是什麼呢? 很多朋友可能會認為列印的是0, 但是正確答案是 1. 這是為什麼呢?

要弄明白這個問題, 我們需要牢記兩點:

案例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...