作用場景:
defer
的用法類似於j**a
裡面的finally
語句塊--->try...catch...finally
示例:
package main注意:import "fmt"
func main()
處理開、關檔案,接收、回覆請求,加鎖、解鎖等操作容易忽略資源的釋放
defer 語句是在函式退出時執行的語句,使用 defer 能非常方便地處理資源釋放問題
使用延遲併發解鎖
示例:
併發使用 map,使用 sync.mutex 進行加鎖,防止競態問題
package main使用defer簡化import (
"fmt"
"sync")
var (
//宣告乙個map
valuekey = make(map[string]int)
valuekeyguard sync.mutex
/*map 預設不是併發安全的,準備乙個 sync.mutex 互斥量保護 map 的訪問*/)
/*宣告乙個函式,讀取map裡面的鍵和值,返回值,並且對競爭的資源加鎖
*/func readvalue(key string) int
func main()
readvalue
函式
/*使用延遲釋放檔案控制代碼使用defer簡化上面的方法
*/func readvalue2(key string) int
操作乙個檔案的流程:
每一步系統操作都需要進行錯誤處理,而每一步處理都會造成一次可能的退出。因此要關注函式退出處正確釋放資源
查詢檔案示例:
package main使用defer改良上面的函式:import (
"fmt"
"os")
func filesize(filename string) int64
//獲取檔案狀態
info, err := f.stat()
if err != nil
/*處理錯誤,此時檔案正常開啟,要釋放資源要呼叫f的close方法關閉檔案*/
//取檔案大小
size := info.size()
//關閉資源
f.close()
//返回名稱和大小
return size}
func main()
/*章節小結:使用defer簡化上面的函式。這裡要注意:
1、defer是放在函式中最後執行的語句,相當於位於棧底
2、defer的宣告式顯式的
*/func filesize2(filename string) int64
//正常開啟資源接下來就是獲取資源
//宣告乙個遇到異常關閉函式的釋放資源的方法
defer f.close()
/*使用 defer,將 f.close() 延遲呼叫
不能將這一句**放在上乙個if判斷前面,一旦檔案開啟錯誤,f 將為空,在延遲語句觸發時,將觸發宕機錯誤。
defer 後的語句(f.close())將會在函式返回前被呼叫,自動釋放資源
*///獲取檔案狀態
info, err:=f.stat()
if err != nil
//獲取檔案大小
size := info.size()
//返回size
return size
}
Go 延遲函式 defer 詳解
go 語言中延遲函式 defer 充當著 try.catch 的重任,使用起來也非常簡便,然而在實際應用中,很多 gopher 並沒有真正搞明白 defer return 返回值 panic 之間的執行順序,從而掉進坑中,今天我們就來揭開它的神秘面紗!先來執行下面兩段 package main im...
Go語言優雅設計之 defer 延遲
defer是go語言中的乙個關鍵字,意為 延遲 可以在乙個函式中新增多個defer語句,這些被定義的defer語句會在函式返回時逆序執行。理解和熟練掌握defer的使用會讓我們 更加優雅簡潔。下面舉一例子作簡要介紹 需求 寫一段 開啟乙個檔案並進行某些操作,完成後關閉檔案。不用defer的寫法 fu...
GO語言延遲函式defer用法分析
defer 在宣告時不會立即執行,而是在函式 return 後,再按照 filo 先進後出 的原則依次執行每乙個 defer,一般用於異常處理 釋放資源 清理資料 記錄日誌等。這有點像物件導向語言的析構函式,優雅又簡潔,是 golang 的亮點之一。1 了解 defer 的執行順序 package ...