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

詳解如何在Go中循環(huán)中使用Defer關(guān)鍵字示例詳解

 更新時(shí)間:2023年09月12日 15:54:39   作者:Slagga技術(shù)的游戲  
這篇文章主要為大家介紹了詳解如何在Go中循環(huán)中使用Defer關(guān)鍵字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

defer在循環(huán)中的行為

在Go編程中,defer是一個(gè)強(qiáng)大的關(guān)鍵字,它安排在包圍它的函數(shù)返回時(shí)執(zhí)行一個(gè)函數(shù)調(diào)用。這一特性使我們能夠在創(chuàng)建之后立即編寫(xiě)清理活動(dòng),如關(guān)閉文件或網(wǎng)絡(luò)連接,增強(qiáng)代碼的可讀性和可維護(hù)性。

然而,在循環(huán)中使用defer需要特別注意,因?yàn)樗赡軐?dǎo)致意外的行為甚至內(nèi)存泄漏。

當(dāng)在循環(huán)中調(diào)用defer時(shí),它不會(huì)立即執(zhí)行被推遲的函數(shù)。相反,它安排在包圍它的函數(shù)返回時(shí)調(diào)用該函數(shù)。這意味著,如果你在循環(huán)中使用defer,所有被推遲的函數(shù)調(diào)用都會(huì)堆疊起來(lái),只有在循環(huán)完成并且包圍它的函數(shù)返回時(shí)才會(huì)被執(zhí)行。

下面是一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明這一點(diǎn):

package?main
import?"fmt"
func?main()?{
????for?i?:=?0;?i?<?5;?i++?{
????????defer?fmt.Println(i)
????}
}

在這個(gè)例子中,當(dāng)main函數(shù)即將返回時(shí),數(shù)字0到4將被打印,而不是在每次迭代后。此外,由于defer的LIFO(后進(jìn)先出)特性,數(shù)字將以相反的順序打印:4, 3, 2, 1, 0。

可能的內(nèi)存泄漏

盡管defer在循環(huán)中的行為在某些情況下可能是有用的,但它也可能導(dǎo)致問(wèn)題。例如,如果循環(huán)沒(méi)有終止,被推遲的函數(shù)調(diào)用會(huì)繼續(xù)堆疊,可能導(dǎo)致內(nèi)存泄漏。這是因?yàn)楸煌七t的函數(shù)調(diào)用存儲(chǔ)在內(nèi)存中,直到它們被執(zhí)行,如果它們沒(méi)有被執(zhí)行,那么內(nèi)存就不會(huì)被釋放。

引入另一個(gè)函數(shù)來(lái)解決問(wèn)題

解決這個(gè)問(wèn)題的一個(gè)常見(jiàn)方法是在循環(huán)的每次迭代中引入另一個(gè)函數(shù),并將defer語(yǔ)句放在這個(gè)新函數(shù)中。這樣,被推遲的函數(shù)調(diào)用將在每次迭代結(jié)束時(shí)被執(zhí)行,而不是堆疊起來(lái)等待包圍函數(shù)返回。

下面是我們?nèi)绾问褂眠@種方法修改前面的例子:

package?main
import?"fmt"
func?main()?{
????for?i?:=?0;?i?<?5;?i++?{
????????func(n?int)?{
????????????defer?fmt.Println(n)
????????}(i)
????}
}

在這個(gè)修改后的例子中,我們引入了一個(gè)接受整數(shù)參數(shù)的匿名函數(shù)。我們?cè)谘h(huán)的每次迭代中使用i作為參數(shù)調(diào)用這個(gè)函數(shù),defer語(yǔ)句在這個(gè)匿名函數(shù)中?,F(xiàn)在,被推遲的fmt.Println(n)調(diào)用將在每次迭代結(jié)束時(shí)被執(zhí)行,數(shù)字0到4將按正確的順序打?。?, 1, 2, 3, 4。

與文件相關(guān)的潛在內(nèi)存泄漏示例

在這個(gè)例子中,我們將創(chuàng)建一些文件,寫(xiě)入它們,但由于defer調(diào)用堆疊起來(lái),包圍函數(shù)永遠(yuǎn)不會(huì)返回,所以我們永遠(yuǎn)不會(huì)關(guān)閉它們:

package?main
import?(
????"os"
????"fmt"
)
func?main()?{
????for?i?:=?0;?i?<?1000000;?i++?{
????????file,?err?:=?os.Create(fmt.Sprintf("testfile%d.txt",?i))
????????if?err?!=?nil?{
????????????panic(err)
????????}
????????defer?file.Close()
????????_,?err?=?file.WriteString("Test")
????????if?err?!=?nil?{
????????????panic(err)
????????}
????}
}

在這段代碼中,我們正在創(chuàng)建一百萬(wàn)個(gè)文件,并向每個(gè)文件中寫(xiě)入字符串“Test”。defer file.Close() 語(yǔ)句意味著每個(gè)文件都將在 main 函數(shù)返回時(shí)關(guān)閉。但是,由于 main 函數(shù)在循環(huán)完成后才返回,所以直到所有的一百萬(wàn)個(gè)文件都被創(chuàng)建并寫(xiě)入后,這些文件才真正被關(guān)閉。這可能導(dǎo)致內(nèi)存泄漏和其他與資源相關(guān)的問(wèn)題,因?yàn)槌绦虺钟写罅康拇蜷_(kāi)文件描述符。

解決文件問(wèn)題

為了解決這個(gè)問(wèn)題,我們可以在循環(huán)中引入另一個(gè)函數(shù),并將 defer file.Close() 語(yǔ)句放在這個(gè)新函數(shù)中。這確保了每個(gè)文件在循環(huán)的每次迭代結(jié)束時(shí)都被關(guān)閉,而不是等待 main 函數(shù)返回:

package?main
import?(
????"os"
????"fmt"
)
func?main()?{
????for?i?:=?0;?i?<?1000000;?i++?{
????????func(i?int)?{
????????????file,?err?:=?os.Create(fmt.Sprintf("testfile%d.txt",?i))
????????????if?err?!=?nil?{
????????????????panic(err)
????????????}
????????????defer?file.Close()
????????????_,?err?=?file.WriteString("Test")
????????????if?err?!=?nil?{
????????????????panic(err)
????????????}
????????}(i)
????}
}

在這段修改后的代碼中,我們引入了一個(gè)匿名函數(shù),該函數(shù)接受一個(gè)整數(shù)參數(shù) i。我們?cè)谘h(huán)的每次迭代中調(diào)用此函數(shù),并將 defer file.Close() 語(yǔ)句放在這個(gè)匿名函數(shù)中。現(xiàn)在,每個(gè)文件都在相應(yīng)的迭代結(jié)束時(shí)關(guān)閉,從而防止了我們?cè)谇懊娴氖纠锌吹降目赡艿膬?nèi)存泄漏和與資源相關(guān)的問(wèn)題。

結(jié)論

在 Go 中,defer 關(guān)鍵字提供了一種強(qiáng)大的方式來(lái)安排函數(shù)調(diào)用在其周?chē)暮瘮?shù)返回時(shí)執(zhí)行。這對(duì)于清理任務(wù)特別有用,但是在循環(huán)中使用 defer 時(shí),重要的是要理解被推遲的調(diào)用會(huì)堆積起來(lái),直到周?chē)暮瘮?shù)返回。這可能導(dǎo)致意外的行為,甚至內(nèi)存泄漏。

解決這個(gè)問(wèn)題的一個(gè)常見(jiàn)方法是在每次迭代中調(diào)用另一個(gè)函數(shù),并將 defer 語(yǔ)句放在這個(gè)新函數(shù)中。這種方法確保推遲的調(diào)用在每次迭代結(jié)束時(shí)執(zhí)行,而不是堆積起來(lái)。理解這些概念及如何有效地使用它們對(duì)于編寫(xiě)高效且可讀的 Go 代碼至關(guān)重要。

以上就是詳解如何在Go中循環(huán)中使用Defer示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go循環(huán)Defer的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go/C語(yǔ)言L(fǎng)eetCode題解997找到小鎮(zhèn)法官

    Go/C語(yǔ)言L(fǎng)eetCode題解997找到小鎮(zhèn)法官

    這篇文章主要為大家介紹了Go語(yǔ)言L(fǎng)eetCode題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • golang?開(kāi)啟opencv圖形化編程

    golang?開(kāi)啟opencv圖形化編程

    這篇文章主要為大家介紹了golang?開(kāi)啟opencv圖形化編程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Go項(xiàng)目在GoLand中導(dǎo)入依賴(lài)標(biāo)紅問(wèn)題的解決方案

    Go項(xiàng)目在GoLand中導(dǎo)入依賴(lài)標(biāo)紅問(wèn)題的解決方案

    這篇文章主要介紹了Go項(xiàng)目在GoLand中導(dǎo)入依賴(lài)標(biāo)紅問(wèn)題的解決方案,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • 如何避免Go語(yǔ)言常見(jiàn)錯(cuò)誤之意外的變量隱藏

    如何避免Go語(yǔ)言常見(jiàn)錯(cuò)誤之意外的變量隱藏

    在Go語(yǔ)言中,變量隱藏(Variable Shadowing)是一個(gè)常見(jiàn)的錯(cuò)誤來(lái)源,變量隱藏發(fā)生在一個(gè)內(nèi)部作用域中聲明的變量與外部作用域的變量同名時(shí),這可能導(dǎo)致開(kāi)發(fā)者無(wú)意中使用了錯(cuò)誤的變量,造成難以追蹤的bug,本文講解一些關(guān)于變量隱藏的常見(jiàn)錯(cuò)誤和如何避免它們的方法
    2024-01-01
  • golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • golang中的jwt使用教程流程分析

    golang中的jwt使用教程流程分析

    這篇文章主要介紹了golang中的jwt使用教程,接下來(lái)我們需要講解一下Claims該結(jié)構(gòu)體存儲(chǔ)了token字符串的超時(shí)時(shí)間等信息以及在解析時(shí)的Token校驗(yàn)工作,需要的朋友可以參考下
    2023-05-05
  • Go語(yǔ)言設(shè)計(jì)模式之結(jié)構(gòu)型模式

    Go語(yǔ)言設(shè)計(jì)模式之結(jié)構(gòu)型模式

    本文主要聚焦在結(jié)構(gòu)型模式(Structural Pattern)上,其主要思想是將多個(gè)對(duì)象組裝成較大的結(jié)構(gòu),并同時(shí)保持結(jié)構(gòu)的靈活和高效,從程序的結(jié)構(gòu)上解決模塊之間的耦合問(wèn)題
    2021-06-06
  • golang 通過(guò)ssh代理連接mysql的操作

    golang 通過(guò)ssh代理連接mysql的操作

    這篇文章主要介紹了golang 通過(guò)ssh代理連接mysql的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 如何基于Golang實(shí)現(xiàn)Kubernetes邊車(chē)模式

    如何基于Golang實(shí)現(xiàn)Kubernetes邊車(chē)模式

    本文介紹了如何基于Go實(shí)現(xiàn)Kubernetes Sidecar模式,并通過(guò)實(shí)際示例演示創(chuàng)建Golang實(shí)現(xiàn)的微服務(wù)服務(wù)、Docker 容器化以及在 Kubernetes 上的部署和管理,感興趣的朋友一起看看吧
    2024-08-08
  • GoLang string與strings.Builder使用對(duì)比詳解

    GoLang string與strings.Builder使用對(duì)比詳解

    這篇文章主要介紹了GoLang string與strings.Builder使用對(duì)比,Builder 用于使用 Write 方法有效地構(gòu)建字符串。它最大限度地減少了內(nèi)存復(fù)制。零值可以使用了。不要復(fù)制非零生成器
    2023-03-03

最新評(píng)論