最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Go中defer的機制

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

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

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

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

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

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

輸出:

main 邏輯
defer 2
defer 1

結(jié)論

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

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

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

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

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

輸出:

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

結(jié)論

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

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

defer 函數(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í)行時才求值,因此會反映變量的最終狀態(tài)。
  • 若需固定閉包中的值,需在注冊時通過參數(shù)傳遞(如 defer func(a int) { ... }(x))。

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

defer 中修改返回值的行為取決于返回值的定義方式(值返回 vs 指針返回)。

示例 4:值返回與指針返回的差異

// 值返回:defer 修改不影響返回值
func f1() int {
    x := 10
    defer func() { x++ }()
    return x // 實際返回的是 x 的拷貝
}

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

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

結(jié)論

  • 值返回:返回值在 return 時被拷貝,defer 修改原變量不影響已拷貝的值。
  • 指針返回:返回的是變量地址,defer 通過地址修改原變量,影響最終結(jié)果。

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

相關(guān)文章

  • 小學生也能看懂的Golang異常處理recover panic

    小學生也能看懂的Golang異常處理recover panic

    在其他語言里,宕機往往以異常的形式存在,底層拋出異常,上層邏輯通過 try/catch 機制捕獲異常,沒有被捕獲的嚴重異常會導致宕機,go語言追求簡潔,優(yōu)雅,Go語言不支持傳統(tǒng)的 try…catch…finally 這種異常
    2021-09-09
  • go mod tidy加載模塊超時的問題及解決

    go mod tidy加載模塊超時的問題及解決

    go mod tidy加載模塊超時的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Golang標準庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例

    Golang標準庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例

    這篇文章主要為大家介紹了Golang標準庫os/exec執(zhí)行外部命令并獲取其輸出包代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • golang關(guān)閉chan通道的方法示例

    golang關(guān)閉chan通道的方法示例

    在go語言中,通道(channel)是一個非常重要的概念,通道提供了一種在不同 goroutine 之間安全地傳遞數(shù)據(jù)的方式,在本文中,我們將討論如何關(guān)閉通道以及在關(guān)閉通道時需要考慮的事項,需要的朋友可以參考下
    2024-02-02
  • Golang與其他語言不同的九個特性

    Golang與其他語言不同的九個特性

    近來關(guān)于對Golang的討論有很多,七牛的幾個大牛們也斷定Go語言在未來將會快速發(fā)展,并且很可能會取代Java成為互聯(lián)網(wǎng)時代最受歡迎的編程語言。本文將帶你了解它不同于其他語言的九個特性
    2021-09-09
  • gin 獲取post請求的json body操作

    gin 獲取post請求的json body操作

    這篇文章主要介紹了gin 獲取post請求的json body操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • golang?日志庫ZAP[uber-go?zap]示例詳解

    golang?日志庫ZAP[uber-go?zap]示例詳解

    ZAP是由Uber開源的高性能Go語言日志庫,支持多種日志級別及基本信息打印,雖然ZAP本身不支持日志分割,但可以結(jié)合lumberjack進行日志切割,實現(xiàn)日志按文件大小、時間或間隔切割等功能,ZAP提供Logger和SugaredLogger兩種日志記錄器
    2024-10-10
  • GO語言內(nèi)存逃逸和GC機制的實現(xiàn)

    GO語言內(nèi)存逃逸和GC機制的實現(xiàn)

    本文深入解析Go語言的內(nèi)存管理機制,重點介紹內(nèi)存逃逸和GC機制,包括指針逃逸、接口類型逃逸等7種典型場景,下面就來詳細的介紹一下
    2026-06-06
  • 淺析Go中fasthttp與net/http的性能對比及應用

    淺析Go中fasthttp與net/http的性能對比及應用

    這篇文章主要為大家詳細介紹了Golang中fasthttp的底層實現(xiàn)以及與net/http的區(qū)別,下面就跟隨小編一起來看看fasthttp到底是如何做到性能如此之快的吧
    2024-03-03
  • 一文帶你深入了解Go語言中切片的奧秘

    一文帶你深入了解Go語言中切片的奧秘

    切片是數(shù)組的一個引用,因此切片是引用類型。但自身是結(jié)構(gòu)體,值拷貝傳遞。本文將通過示例帶大家一起探索一下Go語言中切片的奧秘,感興趣的可以了解一下
    2022-11-11

最新評論

田东县| 丽江市| 乳源| 法库县| 鹤山市| 广河县| 大冶市| 鲜城| 广德县| 墨竹工卡县| 金湖县| 西吉县| 响水县| 柳江县| 孟津县| 莒南县| 余姚市| 辽中县| 古浪县| 个旧市| 中宁县| 阳江市| 诏安县| 军事| 宽甸| 肃北| 凤冈县| 娄底市| 襄汾县| 祥云县| 赣州市| 双辽市| 蒙自县| 正镶白旗| 青铜峡市| 武鸣县| 大城县| 绥阳县| 盐山县| 祁门县| 石渠县|