go語言中的互斥 defer

2021-08-07 06:42:58 字數 1996 閱讀 9373

互斥是傳統的併發程式對共享資源進行訪問控制的主要手段。它由標準庫**包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 那一行時候 因為此...