go語言defer怎么用

這篇文章主要介紹go語言defer怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:主機域名、網(wǎng)絡空間、營銷軟件、網(wǎng)站建設、藁城網(wǎng)站維護、網(wǎng)站推廣。

go語言defer的用法:1、defer語句在函數(shù)返回之前或函數(shù)中的return語句之后執(zhí)行;2、多個defer語句的執(zhí)行順序是逆序執(zhí)行;3、在panic語句后的defer語句不執(zhí)行。

用法介紹:

defer是Go語言中的延遲執(zhí)行語句,用來添加函數(shù)結束時執(zhí)行的代碼,常用于釋放某些已分配的資源、關閉數(shù)據(jù)庫連接、斷開socket連接、解鎖一個加鎖的資源。Go語言機制擔保一定會執(zhí)行defer語句中的代碼。

其它語言中也有類似的機制,比如Java、C#語言里的finally語句,C++語言里的析構函數(shù)(Destructor)可以起類似的作用,C++語言機制擔保在對象被銷毀前一定會執(zhí)行析構函數(shù)中的代碼。C++中的析構函數(shù)析構的是對象,Go中的defer析構的是函數(shù)。

一、defer語句執(zhí)行時機

defer語句在函數(shù)返回之前 或者 函數(shù)中 return語句(return語句可能調(diào)用另一個函數(shù)) 之后執(zhí)行。示例代碼:

package main
 
import (
    "fmt"
)
 
func main() {
    fmt.Println(deferReturn())
}
 
func deferReturn() (ret int) {
    defer func() {
        ret++
    }()
    return 10
}

上述代碼打印出來的值是:11。 defer語句 匿名函數(shù)中的“ret++” 對返回值 10 加 1 變成了 11。再來看一個defer語句出現(xiàn)在return語句之后的代碼:

func returnDefer() (ret int) {
    return 0
    defer func() {
        ret++
        ret++
    }()
    return 1
}

上述returnDefer函數(shù)的返回值是:0。原因是defer語句還沒有添加上代碼執(zhí)行到"return 0"函數(shù)就返回了,因此defer語句就沒有執(zhí)行。

二、多個defer語句的執(zhí)行順序是逆序執(zhí)行

當出現(xiàn)多條 defer 語句時以逆序執(zhí)行(類似棧,即后進先出)。示例代碼:

func deferSample() {
    for i := 0; i < 5; i++ {
        defer fmt.Printf("%d ", i)
    }
}

上述代碼將會輸出:4 3 2 1 0

三、defer與panic

1、在panic語句后面的defer語句不被執(zhí)行

示例代碼:

func panicDefer() {
    panic("panic")
    defer fmt.Println("defer after panic")
}

上述代碼的輸出如下:

panic: panic
goroutine 1 [running]:
main.panicDefer()
    E:/godemo/testdefer.go:17 +0x39
main.main()
    E:/godemo/testdefer.go:13 +0x20
Process finished with exit code 2

可以看到 defer 語句沒有執(zhí)行。

2、在panic語句前的defer語句會被執(zhí)行

示例代碼:

func deferPanic() {
    defer fmt.Println("defer before panic")
    panic("panic")
}

上述代碼的輸出如下:

defer before panic
panic: panic
goroutine 1 [running]:
main.deferPanic()
    E:/godemo/testdefer.go:19 +0x95
main.main()
    E:/godemo/testdefer.go:14 +0x20
Process finished with exit code 2

defer 語句輸出了內(nèi)容。

Go中的panic類似其它語言中的拋出異常,panic后面的代碼不再執(zhí)行(panic語句前面的defer語句會被執(zhí)行)。

四、return 的實現(xiàn)邏輯

1、第一步給返回值賦值(若是有名返回值直接賦值,匿名返回值 則 先聲明再 賦值) ;
2、第二步調(diào)用RET返回指令并傳入返回值,RET會檢查是否存在defer語句,若存 在就先逆序插播 defer語句 ;
3、最后 RET 攜帶返回值退出函數(shù) 。

可以看出 , return 不是一個原子操作,函數(shù)返回值與 RET 返回值并不一定一致。

五、defer、 return、返回值三者順序

defer、 return、返回值 三者的執(zhí)行順序是 : return 最先給返回值賦值;接著 defer 開始執(zhí)行一些收尾工作;最后 RET 指令攜帶返回值退出函數(shù)。

以上是“go語言defer怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:go語言defer怎么用
本文來源:http://www.muchs.cn/article28/jiopcp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站建設域名注冊、網(wǎng)站制作網(wǎng)站導航、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設