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
語句先計算x
和calc("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...