《Effective Go》--defer
Go的defer語句用來排程一個函式呼叫(被延期的函式),使其在執行defer的函式即將返回之前才被執行。這是一種不尋常但又很有效的方法,用於處理類似於不管函式通過哪個執行路徑返回,資源都必須要被釋放的情況。典型的例子是對一個互斥解鎖,或者關閉一個檔案。
// Contents returns the file's contents as a string.
func Contents(filename string) (string, error) {
f, err := os.Open(filename)
if err != nil {
return "", err
}
defer f.Close() // f.Close will run when we're finished.
var result []byte
buf := make([]byte, 100)
for {
n, err := f.Read(buf[0:])
result = append(result, buf[0:n]...) // append is discussed later.
if err != nil {
if err == io.EOF {
break
}
return "", err // f will be closed if we return here.
}
}
return string(result), nil // f will be closed if we return here.
}
對像Close這樣的函式呼叫進行延期,有兩個好處。首先,其確保了你不會忘記關閉檔案,如果你之後修改了函式增加一個新的返回路徑,會很容易犯這樣的錯。其次,這意味著關閉操作緊挨著開啟操作,這比將其放在函式結尾更加清晰。
被延期執行的函式,它的引數(包括接收者,如果函式是一個方法)是在defer執行的時候被求值的,而不是在呼叫執行的時候。這樣除了不用擔心變數隨著函式的執行值會改變,這還意味著單個被延期執行的呼叫點可以延期多個函式執行。這裡有一個簡單的例子。
func trace(s string) string {
fmt.Println("entering:", s)
return s
}
func un(s string) {
fmt.Println("leaving:", s)
}
func a() {
defer un(trace("a"))
fmt.Println("in a")
}
func b() {
defer un(trace("b"))
fmt.Println("in b")
a()
}
func main() {
b()
}
會列印出:
entering: b
in b
entering: a
in a
leaving: a
leaving: b
本文整理自:https://www.kancloud.cn/kancloud/effective/72206
個人微信公眾號:
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
相關文章
- go defer 學習筆記Go筆記
- defer問題——面試Go必看面試Go
- 【Go進階—基礎特性】deferGo
- GO 中 defer的實現原理Go
- Go基礎系列:defer、panic和recoverGo
- GO語言————6.4 defer 和追蹤Go
- Go 中的Defer,Panic 和 Recover 控制流Go
- Go語言中defer的一些坑Go
- Go 語言中 defer 使用時有哪些陷阱?Go
- go 中 defer 的一個隱藏功能Go
- 2. Go中defer使用注意事項Go
- 清華尹成帶你實戰GO案例(7)Go DeferGo
- 『go成長之路』 defer 作用、典型用法以及多個defer呼叫順序,附加defer避坑點,拿來吧你Go
- Go1.13 defer 的效能是如何提高的?Go
- 如何實現 “defer”:Go vs Java vs C/CPPGoJava
- GO 中的 defer 有哪些注意事項?上Go
- go return 的時候傳遞引數給deferGo
- Go 錯誤處理指北:Defer、Panic、Recover 三劍客Go
- 面試Go 被defer的幾個盲區坑了面試Go
- 聽說,99% 的 Go 程式設計師都被 defer 坑過Go程式設計師
- 深入理解defer(上)defer基礎
- Async and Defer
- Go 函式的健壯性、panic異常處理、defer 機制Go函式
- defer vs return
- go 學習筆記之解讀什麼是defer延遲函式Go筆記函式
- Go語言中用於錯誤處理的Defer、Panic和Recover - Sachin KarveGo
- Go語言中 defer 使用場景及注意事項,你是要注意的!Go
- [譯] async 與 defer
- defer關鍵字
- effective java 觀後感Java
- effective C++ : CHAPTER 8C++APT
- 【Effective Modern C++】索引C++索引
- Effective C++筆記C++筆記
- [譯] part 29: golang deferGolang
- 【譯】defer-panic-and-recover
- Effective Python學習筆記Python筆記
- 【Effective STL(3)】關聯容器
- effective C++筆記1C++筆記
- golang基礎–細說deferGolang