defer特性
關鍵字 defer 用於註冊延遲呼叫。
這些呼叫直到 return 前才被執。因此,可以用來做資源清理。
多個defer語句,按先進後出的方式執行。
defer語句中的變數,在defer宣告時就決定了。
defer用途
關閉檔案控制代碼
鎖資源釋放
資料庫連線釋放
defer的觸發
package main
import
"fmt"
func
main()
for i :=
range whatever ()
}}
輸出結果:
444
44
函式正常執行,由於閉包用到的變數 i 在執行的時候已經變成4,所以輸出全都是4.
package main
import
"fmt"
func
returnvalues()
int(
)return result
}func
namedreturnvalues()
(result int)(
)return result
}func
main()
輸出結果:
0
1
註解:在命名返回值方法中,由於返回值在方法定義時已經被定義,所以沒有建立retvalue的過程,result就是retvalue,defer對於result的修改也會被直接返回。
package main
func
test()
(x)// x 被複製
x +=
10 y +=
100println
("x ="
, x,
"y ="
, y)
}func
main()
輸出結果:
x = 20 y = 120
defer: 10 120
package main
import
("fmt"
"sync"
"time"
)var lock sync.mutex
func
test()
func
testdefer()
func
main()
elapsed := time.
since
(t1)
fmt.
println
("test elapsed: "
, elapsed)}(
)func()
elapsed := time.
since
(t1)
fmt.
println
("testdefer elapsed: "
, elapsed)}(
)}
輸出結果:
test elapsed: 223.162µs
testdefer elapsed: 781.304µs
5.在錯誤的位置使用 deferpackage main
輸出結果:
panic: runtime error: invalid memory address or nil pointer dereference
因為在這裡我們並沒有檢查我們的請求是否成功執行,當它失敗的時候,我們訪問了 body 中的空變數 res ,因此會丟擲異常
解決總是在一次成功的資源分配下面使用 defer ,對於這種情況來說意味著:當且僅當 http.get 成功執行時才使用 defer
在上述的**中,當有錯誤的時候,err 會被返回,否則當整個函式返回的時候,會關閉 res.body 。
6.defer異常處理
go語言追求簡潔優雅,所以,go語言不支援傳統的 try…catch…finally 這種異常。
package main
import
"fmt"
func
main()
fmt.
println
("d")}
()f(
)}funcf(
)
輸出結果:
a
c 55
d exit code 0
, process exited normally.
golang延遲函式defer
golang的defer優雅又簡潔,是golang的亮點之一。defer在宣告時不會立即執行,而是在函式return後,再按照先進後出的原則依次執行每個defer,一般用於釋放資源 清理資料 記錄日誌 異常處理等。下面舉個例子 package main import fmt func deferte...
golang學習筆記 defer 延遲函式
語法 defer function name 1 defer在宣告時不會執行,而是推遲執行,在return執行前,倒序執行defer 先進後出 一般用於釋放資源,清理資料,記錄日誌,異常處理等。2 defer有乙個特性 即使函式丟擲異常,defer仍會被執行,這樣不會出現程式錯誤導致資源不被釋放,或...
Go語言入門 延遲呼叫 defer
func functionname parameterlist returntypes 語句defer想當前函式註冊乙個稍微執行的函式呼叫,它會在主調函式或者方法返回之前但是其返回值 當返回值存在 計算後執行。存在多個defer語句採用後進先出lifo last in first out 的順序執行...