9 7Go之函式之defer 延遲執行語句

2022-09-14 22:57:25 字數 2138 閱讀 1637

作用場景:

defer的用法類似於j**a裡面的finally語句塊--->try...catch...finally

示例:

package main

​import "fmt"

​func main()

注意:

處理開、關檔案,接收、回覆請求,加鎖、解鎖等操作容易忽略資源的釋放

defer 語句是在函式退出時執行的語句,使用 defer 能非常方便地處理資源釋放問題

使用延遲併發解鎖

示例:

併發使用 map,使用 sync.mutex 進行加鎖,防止競態問題

package main

​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()

使用defer簡化readvalue函式

/*

使用defer簡化上面的方法

*/func readvalue2(key string) int

使用延遲釋放檔案控制代碼

操作乙個檔案的流程:

每一步系統操作都需要進行錯誤處理,而每一步處理都會造成一次可能的退出。因此要關注函式退出處正確釋放資源

查詢檔案示例:

package main

​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改良上面的函式:

/*

使用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 ...