GO學習系列 defer的使用

2021-08-03 12:09:18 字數 1689 閱讀 7415

在學習go的過程中,發現defer的用法,可以延遲返回,

即在函式return前會按照逆序依次呼叫defer func()。

主要使用在函式返回前需要釋放資源時,而函式又有多個return的分支,

為了防止忘記釋放資源而導致記憶體洩漏等,使用defer 統一釋放。

例如:func  a()

if stateb

return }

defer 還有一些需要注意的地方,儘管在**中可能不會遇到,但還是要注意:

1、defer的順序

在函式中有多個defer時,defer的執行順序為先進後出。

例如:func a()

執行結果為

second use defer

first use defer

2、當defer 函式的入參為實時引數時,引數被實時解析

即傳入的引數為固定值。 例如

func a()

函式的執行順序為:

i = 1

i ++ 此時i為2

fmt.println(i)  列印為2,經過i++

defer fmt.print(i+1) // defer在return前執行,但是在之前已經將引數值傳入函式,

傳入的i值為1,列印為2

return

3、defer 中有名返回值(而非匿名返回值)

此時,函式return result並非為原子操作,可以分解為三步:

r = result  // 賦值result給堆疊/暫存器

defer func() //執行defer操作

return  //執行return,返回原函式呼叫位置

例如1:

func a() (result int) ()

return 1 }

此函式返回值result為多少?

執行為:

result = 1(賦值為1)

defer func //執行defer,result 為2

return  // 此時result為2

例如 2:使用匿名返回值時

func a() ( int) ()

return i }

此時返回值為多少?

執行順序為

i = 1 函式內臨時變數

result = i (return分解第一步,賦值為1)

defer func() (分解第二步,defer,i為2)

return (分解第三步,返回)

返回值為1

例如3:

func a() (r int) ()

return t }

執行順序為:

t = 5 // 函式中臨時變數t為5

r = t // 分解第一部,賦值,返回值r = 5

defer func() // 分解第二步,t=5,但是r不變

return //分解第三步,返回

返回值為5

例如4:

func a() (r int) (t)

return t }

執行順序為:

t = 5 // 函式中臨時變數t為5

r = t // 分解第一部,賦值,返回值r = 5

defer func(r int) (t) 

return //分解第三步,返回

返回值為5

在使用過程中需要注意!!

go語言defer的使用

go語言的defer 延遲執行 語句,是在函式結束前執行,而如果在函式中有多個defer語句時,會像乙個堆疊一樣,先進後出,後進先出。defer語句在進行一些開啟資源的操作時,遇到錯誤需要提前返回,在返回前你需要關閉相應的資源,不然很容易造成資源洩露等問題上很試用。舉個defer語句簡單的使用如下 ...

Go基礎學習 defer

defer延遲函式總是在異常panic或者正常return前返回 defer執行順序按照先入後出的原則,即先入棧的最後執行 但是會先把引數壓入棧,具體執行會在函式結束前 當defer函式中存在函式時會先執行裡面的函式 defer函式呼叫的引數當存在閉包時,會從外面拿取該引數的最新的值 defer常常...

Go 語言 函式defer的使用

在函式中,經常需要建立資源 比如 資料庫的連線 檔案 鎖等 為了在函式執行完畢後,及時釋放資源,go 提供了defer 延時機制 舉個栗子 package main import fmt 當執行到defer 時,暫時不會執行,會將defer 後面的語句 壓入到 棧中 特點 先進後出 當函式執行完畢後...