golang中defer使用小結

2022-06-10 03:48:11 字數 3049 閱讀 4010

golang語言中defer的使用場景較多,用於鎖的關閉,連線的延遲關閉等,通常在函式的結束時呼叫,詳細的講就是在函式結束時返回值賦值後,返回前執行defer的方法,最後才返回,另外defer確實有一定的開銷,拒絕濫用。

第一點、defer 不帶函式執行,defer可以理解像棧,先進後出,看下面**

func main()
按照先進後出的規則輸出

three

twoone

process finished with exit code 0

第二點、defer帶函式的執行,defer執行在返回賦值後,返回前執行,看下面的列子

下面的列子,我們定義 乙個返回值res=1,然後返回(return)res時,賦值為7,根據我們所講,defer函式執行在返回賦值後,返回前,那麼此時res為7,defer 函式執行將res賦值為8,return最後返回應該為8

看下面**

package main

import "fmt"

func main()

func test() (res int) ()

return 7

}

執行結果:

start 7

end 8

8process finished with exit code 0

第三點、defer 一定是延遲執行的麼?答案是肯定的。但是有注意點需要注意

看下面列子

package main

import "fmt"

type slicenum int

func newslice() slicenum

func (s *slicenum) add(elem int) *slicenum

func (s *slicenum) test(elem int) *slicenum

func main()

add 10

add slicenum end &[10]

add 1

add slicenum end &[10 1]

process finished with exit code 0

讀者客官可能會說,這太簡單了,那麼我們在defer 後面連續執行是什麼效果呢?

我們修改下main函式執行的方法如下:

func main()
add 1

add slicenum end &[1]

add 11

add slicenum end &[1 11]

add 12

add slicenum end &[1 11 12]

add 13

add slicenum end &[1 11 12 13]

add 4

add slicenum end &[1 11 12 13 4]

process finished with exit code 0

此時defer後面的乙個方法add(1)先執行了,然後才執行的s.add(11),s.add(12),s.add(13),最後才執行了add(4)

defer後面繼續執行同樣的方法或者其他方法呢?改變下我們的main函式如下:

func main()
這個執行結果又是怎麼樣的?

看下結果吧:

add 1

add slicenum end &[1]

add 4

add slicenum end &[1 4]

add 100

add slicenum end &[1 4 100]

add 11

add slicenum end &[1 4 100 11]

add 12

add slicenum end &[1 4 100 11 12]

add 13

add slicenum end &[1 4 100 11 12 13]

test 200

test &[1 4 100 11 12 13]

process finished with exit code 0

可以看到defer 中先執行的s.add(1).add(4).add(100),然後執行s.add(11), s.add(12),s.add(13),延遲執行的test函式,可以看到defer延遲執行的是最後的乙個函式
如何保證整個defer是在最後執行呢?當然可以了使用 defer fun()(),包住此方法

修改下main函式

func main() ()//用func(){}()包住

s.add(11)

s.add(12)

s.add(13)

}

輸出結果:

add 11

add slicenum end &[11]

add 12

add slicenum end &[11 12]

add 13

add slicenum end &[11 12 13]

add 1

add slicenum end &[11 12 13 1]

add 4

add slicenum end &[11 12 13 1 4]

add 100

add slicenum end &[11 12 13 1 4 100]

test 200

test &[11 12 13 1 4 100]

process finished with exit code 0

此時,先執行s.add(11),s.add(12),s.add(13),然後執行defer函式中的方法s.add(1).add(4).add(100).test(200),最後輸出已經按照我們想要的順序執行了。

Golang中的defer使用

在golang當中,defer 塊會在函式呼叫鍊錶中增加乙個函式呼叫。這個函式呼叫不是普通的函式呼叫,而是會在函式正常返回,也就是return之後新增乙個函式呼叫。因此,defer通常用來釋放函式內部變數。為了更好的學習defer的行為,我們首先來看下面一段 func copyfile dstnam...

golang中defer的使用規則

在golang當中,defer 塊會在函式呼叫鍊錶中增加乙個函式呼叫。這個函式呼叫不是普通的函式呼叫,而是會在函式中正常返回,也就是在return之後新增乙個函式呼叫。因此,defer通常用來釋放函式內部變數。為了更好的學習defer的行為,我們首先來看下面一段 func copyfile dstn...

golang中defer函式的使用

defer是什麼?在go語言中,可以使用關鍵字defer向函式註冊退出呼叫,即主函式退出時,defer後的函式才被呼叫。defer語句的作用是不管程式是否出現異常,均在函式退出時自動執行相關 defer的用途 在函式中,程式設計師經常需要建立資源 比如 資料庫連線 檔案控制代碼 鎖等 為了在函式執行...