golang延遲呼叫(defer)

2021-10-10 08:32:12 字數 2811 閱讀 2346

defer特性

關鍵字 defer 用於註冊延遲呼叫。

這些呼叫直到 return 前才被執。因此,可以用來做資源清理。

多個defer語句,按先進後出的方式執行。

defer語句中的變數,在defer宣告時就決定了。

defer用途

關閉檔案控制代碼

鎖資源釋放

資料庫連線釋放

defer的觸發

package main

import

"fmt"

func

main()

for i :=

range whatever ()

}}

輸出結果:

444

44

函式正常執行,由於閉包用到的變數 i 在執行的時候已經變成4,所以輸出全都是4.

package main

import

"fmt"

func

returnvalues()

int(

)return result

}func

namedreturnvalues()

(result int)(

)return result

}func

main()

輸出結果:

0

1

註解:

在命名返回值方法中,由於返回值在方法定義時已經被定義,所以沒有建立retvalue的過程,result就是retvalue,defer對於result的修改也會被直接返回。

package main

func

test()

(x)// x 被複製

x +=

10 y +=

100println

("x ="

, x,

"y ="

, y)

}func

main()

輸出結果:

x = 20 y = 120

defer: 10 120

package main

import

("fmt"

"sync"

"time"

)var lock sync.mutex

func

test()

func

testdefer()

func

main()

elapsed := time.

since

(t1)

fmt.

println

("test elapsed: "

, elapsed)}(

)func()

elapsed := time.

since

(t1)

fmt.

println

("testdefer elapsed: "

, elapsed)}(

)}

輸出結果:

test elapsed:  223.162µs

testdefer elapsed: 781.304µs

5.在錯誤的位置使用 defer
package main

輸出結果:

panic: runtime error: invalid memory address or nil pointer dereference
因為在這裡我們並沒有檢查我們的請求是否成功執行,當它失敗的時候,我們訪問了 body 中的空變數 res ,因此會丟擲異常

解決總是在一次成功的資源分配下面使用 defer ,對於這種情況來說意味著:當且僅當 http.get 成功執行時才使用 defer

在上述的**中,當有錯誤的時候,err 會被返回,否則當整個函式返回的時候,會關閉 res.body 。

6.defer異常處理

go語言追求簡潔優雅,所以,go語言不支援傳統的 try…catch…finally 這種異常。

package main

import

"fmt"

func

main()

fmt.

println

("d")}

()f(

)}funcf(

)

輸出結果:

a

c 55

d exit code 0

, process exited normally.

golang延遲函式defer

golang的defer優雅又簡潔,是golang的亮點之一。defer在宣告時不會立即執行,而是在函式return後,再按照先進後出的原則依次執行每個defer,一般用於釋放資源 清理資料 記錄日誌 異常處理等。下面舉個例子 package main import fmt func deferte...

golang學習筆記 defer 延遲函式

語法 defer function name 1 defer在宣告時不會執行,而是推遲執行,在return執行前,倒序執行defer 先進後出 一般用於釋放資源,清理資料,記錄日誌,異常處理等。2 defer有乙個特性 即使函式丟擲異常,defer仍會被執行,這樣不會出現程式錯誤導致資源不被釋放,或...

Go語言入門 延遲呼叫 defer

func functionname parameterlist returntypes 語句defer想當前函式註冊乙個稍微執行的函式呼叫,它會在主調函式或者方法返回之前但是其返回值 當返回值存在 計算後執行。存在多個defer語句採用後進先出lifo last in first out 的順序執行...