欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go的defer和閉包示例說明(非內(nèi)部實(shí)現(xiàn))

 更新時(shí)間:2023年08月20日 10:03:50   作者:牙小木木  
這篇文章主要為大家介紹了go的defer和閉包示例說明(非內(nèi)部實(shí)現(xiàn)),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

golang的閉包函數(shù)

用幾個(gè)例子說明golang的閉包函數(shù),結(jié)合defer使用,配合對(duì)應(yīng)代碼及文末總結(jié)。

函數(shù)說明輸出
e1defer調(diào)用,相當(dāng)于是拿到了當(dāng)前err變量的快照,即注冊(cè)defer函數(shù)的時(shí)候,將當(dāng)下err的值塞入到defer中start err1
e2defer 調(diào)用,但是一個(gè)閉包函數(shù),且閉包函數(shù)有傳參,閉包捕獲當(dāng)前err的值仍然是 start err2(閉包捕獲的是變量值的拷貝),且閉包內(nèi)的值變量改變不會(huì)影響外部err的值(詳見見e5)start err2
e3defer 調(diào)用,閉包內(nèi)的變量和匿名函數(shù)外的變量是公用的,沒有傳遞形參,沒有傳遞形參,與上下文共享defer3 error
e4defer 調(diào)用,在函數(shù) e4 中,當(dāng)你將 err 作為參數(shù)傳遞給閉包函數(shù)時(shí),實(shí)際上是創(chuàng)建了一個(gè)閉包函數(shù)的副本,這個(gè)副本在閉包內(nèi)部獨(dú)立于外部作用域。這種行為是因?yàn)殚]包在捕獲外部變量時(shí),會(huì)將外部變量的當(dāng)前值復(fù)制到閉包內(nèi)部,形成一個(gè)閉包環(huán)境,現(xiàn)在理解了閉包的概念了吧。具體來說,在 defer 語句執(zhí)行的時(shí)候,閉包函數(shù)會(huì)將 err 的當(dāng)前值(即 "start err4")復(fù)制到閉包內(nèi)部的參數(shù)中。之后,無論外部作用域的 err 是否發(fā)生改變,閉包內(nèi)部的參數(shù)值都會(huì)保持不變,因?yàn)殚]包已經(jīng)捕獲了一個(gè)快照start err4
e5傳值的情況下,閉包內(nèi)的值變量改變不會(huì)影響外部err的值,(互相獨(dú)立)now err is start err5 start err5CHANGE ME
e6閉包沒有傳值,拿到的err是最后賦值的,now err is start err6 defer6 error CHANGE ME
package main
import (
    "errors"
    "fmt"
)
func e1(){
    err := errors.New("start err1")
    defer fmt.Println(err)
    err = errors.New("defer1 error")
    return
}
func e2(){
    err := errors.New("start err2")
    defer func(e error) {
        fmt.Println(e)
    }(err)
    err = errors.New("defer2 error")
    return
}
func e3(){
    err := errors.New("start err3")
    //閉包內(nèi)的變量和匿名函數(shù)外的變量是公用的,沒有傳遞形參,沒有傳遞形參,與上下文共享
    defer func() {
        fmt.Println(err)
    }()
    err = errors.New("defer3 error")
    return
}
func e4(){
    var err error
    err = errors.New("start err4")
    //閉包內(nèi)的變量和匿名函數(shù)外的變量是公用的,但是如果傳了形參,那就和上文的共用了
    //在函數(shù) e4 中,當(dāng)你將 err 作為參數(shù)傳遞給閉包函數(shù)時(shí),實(shí)際上是創(chuàng)建了一個(gè)閉包函數(shù)的副本,這個(gè)副本在閉包內(nèi)部獨(dú)立于外部作用域。這種行為是因?yàn)殚]包在捕獲外部變量時(shí),會(huì)將外部變量的當(dāng)前值復(fù)制到閉包內(nèi)部,形成一個(gè)閉包環(huán)境
    //具體來說,在 defer 語句執(zhí)行的時(shí)候,閉包函數(shù)會(huì)將 err 的當(dāng)前值(即 "start err4")復(fù)制到閉包內(nèi)部的參數(shù)中。之后,無論外部作用域的 err 是否發(fā)生改變,閉包內(nèi)部的參數(shù)值都會(huì)保持不變,因?yàn)殚]包已經(jīng)捕獲了一個(gè)快照。
    defer func(err error) {
        fmt.Println(err)
    }(err)
    err = errors.New("defer4 error")
    return
}
func e5(){
    err := errors.New("start err4")
    defer func(err error ) {
        err=errors.New(err.Error()+"CHANGE ME")
        fmt.Println(err)
    }(err)
    fmt.Println("now err is ",err)
    err = errors.New("defer5 error")
    return
}
func e6() {
    err := errors.New("start err6")
    defer func() {
        err = errors.New(err.Error() + " CHANGE ME")
        fmt.Println(err)
    }()
    fmt.Println("now err is ", err)
    err = errors.New("defer6 error")
    return
}
func main(){
    e1()
    e2()
    e3()
    e4()
    e5()
    e6()
}

變量作用域和閉包

Go 語言中的變量作用域由代碼塊決定。變量在其定義的代碼塊內(nèi)可見。

閉包是一個(gè)函數(shù)值,它可以捕獲其定義時(shí)周圍的作用域內(nèi)的變量。

閉包可以在定義之外被調(diào)用,仍然訪問并修改捕獲的變量。

閉包和變量捕獲

閉包函數(shù)可以捕獲外部作用域的變量。在閉包內(nèi)部,它們可以訪問外部變量的值。

閉包捕獲的變量是其副本,即閉包內(nèi)部使用的是變量值的拷貝。

修改閉包內(nèi)部捕獲的變量不會(huì)影響外部作用域中的變量,除非你在閉包內(nèi)直接修改外部作用域的變量。

閉包參數(shù)傳遞

在閉包內(nèi)部接收外部作用域的變量作為參數(shù),可以使閉包操作外部作用域的變量。

使用閉包參數(shù)傳遞可以有效隔離閉包內(nèi)外的變量,從而保持可預(yù)測(cè)性。

在 defer 中的閉包

當(dāng)在 defer 語句中使用閉包時(shí),閉包內(nèi)部的變量會(huì)被“捕獲”并在 defer 執(zhí)行時(shí)使用。
在閉包內(nèi)部修改閉包捕獲的變量不會(huì)影響外部作用域中的變量,除非你直接修改外部作用域的變量。

總結(jié)

閉包是一種強(qiáng)大的概念,可以使函數(shù)擁有狀態(tài)并延遲執(zhí)行。

了解閉包如何操作變量作用域,以及它們?nèi)绾尾东@和修改變量,是編寫高效、清晰的 Go 代碼的關(guān)鍵。

當(dāng)在閉包中操作變量時(shí),要注意變量作用域、捕獲的變量副本和對(duì)外部作用域的影響。

以上就是go的defer和閉包示例說明(非內(nèi)部實(shí)現(xiàn))的詳細(xì)內(nèi)容,更多關(guān)于go defer閉包的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • jenkins配置golang?代碼工程自動(dòng)發(fā)布的實(shí)現(xiàn)方法

    jenkins配置golang?代碼工程自動(dòng)發(fā)布的實(shí)現(xiàn)方法

    這篇文章主要介紹了jenkins配置golang?代碼工程自動(dòng)發(fā)布,jks是個(gè)很好的工具,使用方法也很多,我只用了它簡(jiǎn)單的功能,對(duì)jenkins配置golang相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-07-07
  • Golang開發(fā)中常用的代碼片段匯總

    Golang開發(fā)中常用的代碼片段匯總

    這篇文章主要給大家匯總了在Golang開發(fā)中常用的代碼片段,這些代碼片段都是在日常工作中編寫golang應(yīng)用時(shí)使用到,需要的朋友可以參考借鑒,下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • Go到底能不能實(shí)現(xiàn)安全的雙檢鎖(推薦)

    Go到底能不能實(shí)現(xiàn)安全的雙檢鎖(推薦)

    這篇文章主要介紹了Go到底能不能實(shí)現(xiàn)安全的雙檢鎖,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • go語言執(zhí)行windows下命令行的方法

    go語言執(zhí)行windows下命令行的方法

    這篇文章主要介紹了go語言執(zhí)行windows下命令行的方法,實(shí)例分析了Go語言操作windows下命令行的技巧,需要的朋友可以參考下
    2015-03-03
  • go mod 使用舊版本 版本號(hào)指定方式

    go mod 使用舊版本 版本號(hào)指定方式

    這篇文章主要介紹了go mod 使用舊版本 版本號(hào)指定方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go實(shí)現(xiàn)各類限流的方法

    Go實(shí)現(xiàn)各類限流的方法

    這篇文章主要介紹了Go實(shí)現(xiàn)各類限流的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • GScript?編寫標(biāo)準(zhǔn)庫示例詳解

    GScript?編寫標(biāo)準(zhǔn)庫示例詳解

    這篇文章主要為大家介紹了GScript?編寫標(biāo)準(zhǔn)庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Golang字符串變位詞示例詳解

    Golang字符串變位詞示例詳解

    這篇文章主要給大家介紹了關(guān)于GoLang字符串變位詞的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 一文徹底理解Golang閉包實(shí)現(xiàn)原理

    一文徹底理解Golang閉包實(shí)現(xiàn)原理

    閉包對(duì)于一個(gè)長期寫Java的開發(fā)者來說估計(jì)鮮有耳聞,光這名字感覺就有點(diǎn)"神秘莫測(cè)"。這篇文章的主要目的就是從編譯器的角度來分析閉包,徹底搞懂閉包的實(shí)現(xiàn)原理,需要的可以參考一下
    2022-10-10
  • Go/C語言LeetCode題解997找到小鎮(zhèn)法官

    Go/C語言LeetCode題解997找到小鎮(zhèn)法官

    這篇文章主要為大家介紹了Go語言LeetCode題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論