亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入理解Go中defer的機(jī)制

 更新時(shí)間:2025年02月05日 09:05:31   作者:叫我DPT  
本文主要介紹了Go中defer的機(jī)制,包括執(zhí)行順序、參數(shù)預(yù)計(jì)算、閉包和與返回值的交互,具有一定的參考價(jià)值,感興趣的可以了解一下

defer 是 Go 語(yǔ)言中用于延遲執(zhí)行函數(shù)調(diào)用的關(guān)鍵字,常用于資源清理(如關(guān)閉文件、釋放鎖)和異常處理。但其行為機(jī)制存在一些隱蔽的細(xì)節(jié),稍有不慎可能導(dǎo)致難以察覺(jué)的 Bug。本文通過(guò)多個(gè)直觀示例,深入剖析 defer 的核心機(jī)制。

一、defer 的執(zhí)行順序:后進(jìn)先出(LIFO)

多個(gè) defer 語(yǔ)句按逆序執(zhí)行,類似于棧的“后進(jìn)先出”原則。

示例 :多個(gè) defer 的執(zhí)行順序

func main() {
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    fmt.Println("main 邏輯")
}

輸出:

main 邏輯
defer 2
defer 1

結(jié)論

  • defer 語(yǔ)句按注冊(cè)順序的逆序執(zhí)行,確保依賴資源按正確順序釋放(如先打開(kāi)的文件后關(guān)閉)。

二、defer 的參數(shù)預(yù)計(jì)算:值拷貝的陷阱

defer 的參數(shù)在注冊(cè)時(shí)即被預(yù)計(jì)算并拷貝,而非執(zhí)行時(shí)動(dòng)態(tài)獲取。

示例 :參數(shù)預(yù)計(jì)算的影響

func main() {
    x := 10
    defer fmt.Println("defer 中的 x:", x) // x 的值在注冊(cè)時(shí)被拷貝
    x = 20
    fmt.Println("main 中的 x:", x)
}

輸出:

main 中的 x: 20
defer 中的 x: 10

結(jié)論

  • 若參數(shù)是值類型(如 int、string),defer 會(huì)拷貝當(dāng)前值,后續(xù)修改不影響已注冊(cè)的 defer。
  • 若參數(shù)是指針或引用類型(如 *int、slice),拷貝的是地址,后續(xù)修改會(huì)影響 defer 的執(zhí)行結(jié)果。

三、defer 與閉包:動(dòng)態(tài)綁定的變量

defer 函數(shù)若使用外部變量(閉包),會(huì)引用變量的最新值,而非注冊(cè)時(shí)的值。

示例 :閉包中的變量綁定

func main() {
    x := 10
    defer func() {
        fmt.Println("defer 中的 x:", x) // 閉包引用最新值
    }()
    x = 20
    fmt.Println("main 中的 x:", x)
}

輸出:

main 中的 x: 20
defer 中的 x: 20

結(jié)論

  • 閉包中的變量在 defer 執(zhí)行時(shí)才求值,因此會(huì)反映變量的最終狀態(tài)。
  • 若需固定閉包中的值,需在注冊(cè)時(shí)通過(guò)參數(shù)傳遞(如 defer func(a int) { ... }(x))。

四、defer 與返回值:隱式的賦值邏輯

defer 中修改返回值的行為取決于返回值的定義方式(值返回 vs 指針?lè)祷兀?/p>

示例 4:值返回與指針?lè)祷氐牟町?/h3>
// 值返回:defer 修改不影響返回值
func f1() int {
    x := 10
    defer func() { x++ }()
    return x // 實(shí)際返回的是 x 的拷貝
}

// 指針?lè)祷兀篸efer 修改影響返回值
func f2() *int {
    x := 10
    defer func() { x++ }()
    return &x // 返回 x 的地址
}

func main() {
    fmt.Println(f1()) // 輸出 10
    fmt.Println(*f2()) // 輸出 11
}

結(jié)論

  • 值返回:返回值在 return 時(shí)被拷貝,defer 修改原變量不影響已拷貝的值。
  • 指針?lè)祷?/strong>:返回的是變量地址,defer 通過(guò)地址修改原變量,影響最終結(jié)果。

到此這篇關(guān)于Go中defer的機(jī)制的文章就介紹到這了,更多相關(guān)Go defer機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 解決golang處理http response碰到的問(wèn)題和需要注意的點(diǎn)

    解決golang處理http response碰到的問(wèn)題和需要注意的點(diǎn)

    這篇文章主要介紹了解決golang處理http response碰到的問(wèn)題和需要注意的點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Mac下Vs code配置Go語(yǔ)言環(huán)境的詳細(xì)過(guò)程

    Mac下Vs code配置Go語(yǔ)言環(huán)境的詳細(xì)過(guò)程

    這篇文章給大家介紹Mac下Vs code配置Go語(yǔ)言環(huán)境的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • GoRoutines高性能同時(shí)進(jìn)行多個(gè)Api調(diào)用實(shí)現(xiàn)

    GoRoutines高性能同時(shí)進(jìn)行多個(gè)Api調(diào)用實(shí)現(xiàn)

    這篇文章主要為大家介紹了GoRoutines高性能同時(shí)進(jìn)行多個(gè)Api調(diào)用實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Golang的關(guān)鍵字defer的使用方法

    Golang的關(guān)鍵字defer的使用方法

    這篇文章主要介紹了Golang的關(guān)鍵字defer的使用方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型

    Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型

    這篇文章主要介紹了Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型,根據(jù)Go泛型使用的三步曲提到的:類型參數(shù)化、定義類型約束、類型實(shí)例化我們一步步來(lái)定義我們的緩存結(jié)構(gòu)體,需要的朋友可以參考下
    2022-07-07
  • Go語(yǔ)言算法之尋找數(shù)組第二大元素的方法

    Go語(yǔ)言算法之尋找數(shù)組第二大元素的方法

    這篇文章主要介紹了Go語(yǔ)言算法之尋找數(shù)組第二大元素的方法,以實(shí)例形式分析了不排序、只循環(huán)一次來(lái)實(shí)現(xiàn)尋找數(shù)組第二大元素的技巧,是比較典型的算法,需要的朋友可以參考下
    2015-02-02
  • 淺談Go語(yǔ)言不提供隱式數(shù)字轉(zhuǎn)換的原因

    淺談Go語(yǔ)言不提供隱式數(shù)字轉(zhuǎn)換的原因

    本文主要介紹了淺談Go語(yǔ)言不提供隱式數(shù)字轉(zhuǎn)換的原因,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 解決Go?Json?Unmarshal反序列化丟失數(shù)字精度問(wèn)題

    解決Go?Json?Unmarshal反序列化丟失數(shù)字精度問(wèn)題

    業(yè)務(wù)會(huì)使用?id生成器?產(chǎn)生的?分布式唯一ID,長(zhǎng)度比較長(zhǎng),所以代碼反序列化時(shí),會(huì)出現(xiàn)精度丟失問(wèn)題,那如何解決呢,下面小編就來(lái)和大家詳細(xì)講講
    2023-08-08
  • golang 隨機(jī)數(shù)的兩種方式

    golang 隨機(jī)數(shù)的兩種方式

    本文主要介紹了golang 隨機(jī)數(shù)的兩種方式,一種是偽隨機(jī),另一種是真隨機(jī),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Golang時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則

    Golang時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則

    這篇文章主要為大家介紹了Golang?時(shí)間處理庫(kù)go-carbon?v2.2.13發(fā)布細(xì)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評(píng)論