在開始使用go進行編碼時,defer是要關注的乙個很重要的特性。它非常簡單:在任何函式中,給其他函式的呼叫加上字首defer
以確保該函式在外部函式退出之前立即執行,即使外部函式出現異常被中斷,該延遲函式也將執行。
但是,你還可以使用defer在任何函式開始後和結束前執行配對的**。這個隱藏的功能在網上的教程和書籍中很少提到。要使用此功能,需要建立乙個函式並使它本身返回另乙個函式,返回的函式將作為真正的延遲函式。在 defer 語句呼叫父函式後在其上新增額外的括號來延遲執行返回的子函式如下所示:
func main()
func greet() func() // this will be deferred
}
輸出以下內容:
hello!
some code here...
bye!
父函式返回的函式將是實際的延遲函式。父函式中的其他**將在函式開始時(由 defer 語句放置的位置決定)立即執行。
這為開發者提供了什麼能力?因為在函式內定義的匿名函式可以訪問完整的詞法環境(lexical environment),這意味著在函式中定義的內部函式可以引用該函式的變數。在下乙個示例中看到的,引數變數在measure
函式第一次執行和其延遲執行的子函式內都能訪問到:
func main()
func example()
func otherexample()
func measure(name string) func()
}
輸出以下內容:
starting example
some code here
exiting example after 0s
starting otherexample
some other code here
exiting otherexample after 0s
此外函式命名的返回值也是函式內的區域性變數,所以上面例子中的measure
函式如果接收命名返回值作為引數的話,那麼命名返回值在延遲執行的函式中訪問到,這樣就能將measure
函式改造成記錄入參和返回值的工具函式。
下面的示例是引用《go 語言程式設計》中的**段:
func bigslowoperation()
func trace(msg string) func()
}
可以想象,將**延遲在函式的入口和出口使用是非常有用的功能,尤其是在除錯**的時候。 go中defer的作用
go中defer的作用。1,在函式執行結束時,進行清理操作。比如 關閉檔案流 open a file defer file.close 解鎖乙個加鎖的資源 mu.lock defer mu.unlock 列印最終報告 printheader defer printfooter 關閉資料庫鏈結 ope...
Go中的延遲處理 defer
defer 語句 該語句表示預定對乙個函式進行呼叫,呼叫的函式被稱為延遲函式 eg defer fmt.println thye finishing touches.defer fmt.println 11 該語句在函式結束時被呼叫,其執行順序和書寫順序相反,即先列印 11,再列印 the fini...
iOS 13中隱藏的10個功能,每乙個都超實用!
最近幫大家總結了一波ios 13上的隱藏功能,不得不說,每乙個都超實用!1 語音搜尋iphone 很明顯的,在搜尋欄的最右邊加入了乙個麥克風的標誌,我們可以通過語音輸入進行搜尋,而不是必須鍵入文字進行搜尋查詢。2 imessage搜尋 imessage搜尋一直很雞肋,不過在新的ios 13中,搜尋乙...