互斥是傳統的併發程式對共享資源進行訪問控制的主要手段。它由標準庫**包sync中的mutex結構體型別代表。sync.mutex型別(確切地說,是*sync.mutex型別)只有兩個公開方法——lock和unlock。顧名思義,前者被用於鎖定當前的互斥量,而後者則被用來對當前的互斥量進行解鎖。
import
"sync"
//處理同步需求,匯入包
var mutex = &sync.rwmutex{} //互斥定義
mutex.lock() // 上鎖
defer mutex.unlock() // 解鎖,在defer後指定的函式會在函式退出前呼叫。
// 通過證書hash值讀取證書
func (ca *ca) readcertificatebyhash(hash byte) (byte, error)
在函式塊中使用defer,相當於函式對應的棧空間,先進後出。函式結束後呼叫棧,進行defer操作。
golang的defer關鍵字,它可以在函式返回前執行一些操作,最常用的就是開啟乙個資源(例如乙個檔案、資料庫連線等)時就用defer延遲關閉改資源,以免引起記憶體洩漏。
如下**所示,我們一般寫開啟乙個資源是這樣操作的:
func readwrite() bool
if failurey
file.close()
return
true
}
上面的**有很多是重複的,go的defer有效解決了這個問題。使用它後,不但**量減少了很多,而且程式變得更優雅:
func readwrite() bool
if failurey
return
true
}
package main
import
"fmt"
import
"time"
type user struct
func (this *user) close()
func
print(z int)
func deferret(x,y int) (int)
func main()
defer u1.close()
u2 := &user
defer u2.close()
time.sleep(10 * time.second) // 實際上,執行緒sleep的10秒,u1,和u2早就可以close()了,但卻需要依賴main()函式的結束,才能defer執行。
fmt.println("main done !")
// 函式中的defer
res := deferret(1
,1) fmt.println("main res = ", res)
// 我們可以在官方的文件中看到defer的執行順序是逆序的,也就是先進後出的順序:
// 列印結果是:4,3,2,1,0
fmt.printf("print i:")
for i :=0; i <5; i++
fmt.println("")
}
執行程式$ go run defertest.go
,執行結果:
print
name: // 之後游標大概會閃爍10s,然後列印其他資訊
main
done
!deferret
z = 2
print
z = 0
main
res = 52
printi:4
3210
lily
closed!!
!jack
closed!!
!
參考文章: go語言中的defer
defer的詞義 延遲 推遲 在go語言中,使用defer關鍵字來延遲乙個函式或者方法的執行 1.defer 函式或方法 乙個函式或方法會被延遲執行 2.defer的使用 a 物件檔案的close 臨時檔案的刪除 b go語言中關於異常的處理,使用panic 和recover panic函式引發的恐...
Go語言中defer的使用
func print a int func add a,b int int fmt.println add 4,3 上面這段 defer語句輸出的是4,add返回的值是7。defer可以用於檔案的開啟和關閉,鎖的開啟和關閉。package ioutil func readfile filename ...
go語言中的defer關鍵字
在go語言裡面 有乙個關鍵字 我們經常會碰到 就是 defer 關於defer我們需要記住以下幾點 因此,defer通常用來釋放函式內部變數。在看下面的 func test01 未引用引數 跟測試一一樣 func test02 a 此處引用了引數 tese01 執行到 defer 那一行時候 因為此...