延遲調用defer
關鍵字 defer
用于延遲一個函數或者方法(或者當前所創建的匿名函數)的執行。注意,defer語句只能出現在函數或方法的內部。
defer 語句經常被用于處理成對的操作,如打開、關閉、連接、斷開連接、加鎖、釋放鎖。通過defer 機制,不論函數邏輯多復雜,都能保證在任何執行路徑下,資源被釋放。釋放資源的 defer應該直接跟在請求資源的語句后。
多個defer的執行順序
如果一個函數中有多個 defer 語句,它們會以LIFO(后進先出)的順序執行。哪怕函數或某個延遲調用發生錯誤,這些調用依舊會被執行。
- 正常情況下,程序崩潰,下面的程序將不會被執行。
defer和匿名函數結合使用
注意,defer已經進行了傳參,只是沒有調用。
defer func(a, b int) {fmt.Printf("a=%d,b=%d\n", a, b)
}(a, b)
相當于,提前已經把a,b的值傳入,只有等到mian函數結束前才進行調用。
defer func(a, b int) {fmt.Printf("a=%d,b=%d\n", a, b)
}(10,20)
獲取命令行參數
接收用戶傳遞的參數,都是以字符串方式傳遞。
局部變量
- 定義在
{}
里畫的變量就是局部變量,只能在{}
里面有效。
- 執行到定義變量那句話,才開始分配空間,離開作用域自動釋放。
全局變量
定義在函數外部的變量是全局變量,在任何地方都可以使用。
- 不同作用域,允許定義同名變量,使用變量的原則為就近原則。