golang基礎小記(12) defer

2021-10-08 13:04:26 字數 1501 閱讀 7666

go語言中的defer語句會將其後面跟隨的函式推遲到外層函式返回之後執行。推遲呼叫的函式其引數會立即求值,但直到外層函式返回前該函式都不會被呼叫。推遲的函式呼叫會被壓入乙個棧中,當外層函式返回時,被推遲的函式會按照後進先出的順序呼叫。

defer語句後面只能跟函式呼叫。

示例:

a :=

1b :=

2defer fmt.

println(1

, a + b)

// 推遲的函式引數會立即賦值,後續改變引數值不會影響結果

defer

func()

()a =2

b =3

defer fmt.

println(3

, a + b)

// 後推遲的語句先輸出結果

fmt.

println

("end"

)

輸出:

end35

2213

由於defer語句延遲呼叫的特性,所以defer語句能非常方便的處理資源釋放問題。比如:資源清理、檔案關閉、解鎖及記錄時間等。

對返回值進行賦值

執行defer語句

執行ret指令(函式返回)

這裡需要區分一下函式返回值命名和不命名的情況。當返回值命名時,defer語句可以對返回值進行修改,在判斷返回值時需要注意defer語句;當返回值沒有命名時,defer語句不會影響返回值。

示例:

func

test1()

int(

)return x

}func

test2()

(x int)(

)return

}func

test3()

(x int

)(x)

return

}func

main()

func

calc

(index string

, a, b int

)int

func

main()

輸出:

a 123

b 10212

bb 10

1222

aa 1

34

因為defer語句推遲的函式的引數會立即求值,所以第一句defer語句先計算xcalc("a", x, y),傳入的x = 1, y = 2,第二句同理,只是傳入的x的值變成了10。

參考1、參考2、參考3

Golang 基礎 12 基礎小結

目錄 package main import fmt func ppp s int func main 結果是 本來應該改變的,為什麼沒有變?所以使用slice會修改時,建議盡量使用返回值 package main import fmt time func main 建議使用第一行的輸出方式,第二行...

PHP基礎小記

php 超文字預處理器hypertext preprocessor php檔案 可包含文字 html 標籤以及指令碼,在伺服器端執行,向客戶端瀏覽器返回純粹的 html 語法 php指令碼塊以 結束,基礎指令 輸出文字echo print,注釋 同c 變數 以 符號開始,無需宣告變數型別 字串 並置...

Golang學習 基礎

一 helloworld 首先是helloworld package main import fmt func main 編譯和執行 go buid hello.go hello 二 變數,常量 1.定義乙個變數 var a int var b int 10 c 10 等價於var c int 10...