国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

??
特性1:多個(gè) defer 時(shí)的調(diào)用順序:先進(jìn)后出
特性2:作用域?yàn)楫?dāng)前函數(shù),不同函數(shù)下?lián)碛胁煌?defer 棧
特性4:return 與 defer 執(zhí)行順序:return 先 defer 后
rrreee
? ??? ?? Golang 8?? ??? ???? Go ?? ??? 5?? ?? ??? ?????

8?? ??? ???? Go ?? ??? 5?? ?? ??? ?????

Apr 23, 2023 pm 05:40 PM
??? ??

Go ???? defer ???? ???? ??? ?? ??? ?? ??? ??? ? ????. ?? ??? ?? ?? ??? ??, ?? ??, ??? ?? ?? ?? ??? ???? ?? defer ???? ???? ??? ????. defer 關(guān)鍵字可以將代碼延遲到函數(shù)結(jié)束之前執(zhí)行。在開發(fā)中,我們經(jīng)常使用defer關(guān)鍵字完成善后工作,如關(guān)閉打開的文件描述符、關(guān)閉連接以及釋放資源等。

func?demo0()?{
????fileName?:=?"./test.txt"
????f,?_?:=?os.OpenFile(fileName,?os.O_RDONLY,?0)
????defer?f.Close()

????contents,?_?:=?ioutil.ReadAll(f)
????fmt.Println(string(contents))}

defer關(guān)鍵字一般緊跟在打開資源代碼的后面,防止后續(xù)忘記釋放資源,defer 聲明的代碼實(shí)際上要等到函數(shù)結(jié)束之前才會(huì)被執(zhí)行。defer 雖然簡單易用,但如果忽略了它的特性,就會(huì)在開發(fā)中面臨困惑。于是,我總結(jié)了 defer 的五大特性,通過 8 個(gè)demo逐步介紹 defer 的特性。

特性1:多個(gè) defer 時(shí)的調(diào)用順序:先進(jìn)后出

使用多個(gè) defer 關(guān)鍵字時(shí),先被聲明的 defer 語句后被調(diào)用。類似于“棧”先進(jìn)后出的特性,defer 的這一特性也很好理解,先被打開的資源,可能會(huì)被后續(xù)代碼依賴,所以要后釋放才安全。

func?demo1()?{
????for?i?:=?0;?i?<?5;?i++?{
????????defer?fmt.Println("defer:",?i)
????}}//?defer:?4//?defer:?3//?defer:?2//?defer:?1//?defer:?0

特性2:作用域?yàn)楫?dāng)前函數(shù),不同函數(shù)下?lián)碛胁煌?defer 棧

運(yùn)行 demo2 ,從結(jié)果中可以看出,第一個(gè)匿名函數(shù)和第二個(gè)匿名函數(shù)的 defer 執(zhí)行順序沒有關(guān)系。
defer 作用域僅為當(dāng)前函數(shù),在當(dāng)前函數(shù)最后執(zhí)行,所以不同函數(shù)下?lián)碛胁煌?defer 棧。

func?demo2()?{
????func()?{
????????defer?fmt.Println(1)
????????defer?fmt.Println(2)
????}()

????fmt.Println("===?新生代農(nóng)民工啊?===")

????func()?{
????????defer?fmt.Println("a")
????????defer?fmt.Println("b")
????}()}//?2//?1//?===?新生代農(nóng)民工啊?===//?b//?a

特性3:defer 后的函數(shù)形參在聲明時(shí)確認(rèn)(預(yù)計(jì)算參數(shù))

運(yùn)行 demo3_1 ,根據(jù)結(jié)果,我們可以得出:defer 在聲明時(shí),就已經(jīng)確認(rèn)了形參n的值,而不是在執(zhí)行時(shí)確認(rèn)的;所以,后續(xù)變量 num 無論如何改變都不影響 defer 的輸出結(jié)果。

func?demo3_1()?{
????num?:=?0
????defer?func(n?int)?{
????????fmt.Println("defer:",?n)
????}(num)
????//?等同?defer?fmt.Println("defer:",?num)

????for?i?:=?0;?i?<?10;?i++?{
????????num++
????}

????fmt.Println(num)}//10//defer:?0

運(yùn)行 demo3_2,為什么這里 defer 的最終輸出的結(jié)果會(huì)和變量 num 相同?因?yàn)檫@里使用的是指針。
defer 聲明時(shí),已經(jīng)確認(rèn)了形參p指針的指向地址,指向變量 num;后續(xù)變量 num 發(fā)生改變。所以在 defer 執(zhí)行時(shí),輸出的是p指針指向的變量num的當(dāng)前值。

func?demo3_2()?{
????num?:=?0
????p?:=?&num????defer?func(p?*int)?{
????????fmt.Println("defer:",?*p)
????}(p)

????for?i?:=?0;?i?<?10;?i++?{
????????num++
????}

????fmt.Println(*p)}//10//defer:?10

再看一下 demo3_3,defer 打印的變量并沒有通過函數(shù)參數(shù)傳入,在defer執(zhí)行時(shí),才獲取的”全局變量”num,所以 defer 輸出結(jié)果與變量num一致。

func?demo3_3()?{
????num?:=?0
????defer?func()?{
????????fmt.Println("defer:",?num)
????}()

????for?i?:=?0;?i?<?10;?i++?{
????????num++
????}

????fmt.Println(num)}//10//defer:?10

特性4:return 與 defer 執(zhí)行順序:return 先 defer 后

運(yùn)行 demo4_1,可以發(fā)現(xiàn) defer、return 都是在函數(shù)最后執(zhí)行,但 return 先于 defer 執(zhí)行;

func?demo4_1()?(int,?error)?{
????defer?fmt.Println("defer")
????return?fmt.Println("return")}//?return//?defer

這一點(diǎn)從輸出結(jié)果上顯而易見,但當(dāng) return、defer 的執(zhí)行順序和**函數(shù)返回值**“相遇”時(shí),又將會(huì)產(chǎn)生許多復(fù)雜的場(chǎng)景。
在 demo4_2 中,函數(shù)使用命名返回值,最終輸出結(jié)果為7。其中經(jīng)歷了這幾個(gè)過程:

  1. (首先)變量 num 作為返回值,初始值為0;

  2. (其次)隨后變量 num 被賦值為 10;

  3. (然后)return 時(shí),變量 num 作為返回值被重新賦值為 2;

  4. (接著)defer 在 return 后執(zhí)行,拿到變量 num 進(jìn)行修改,值為7;

  5. (最后)變量 num 作為返回值,最終函數(shù)返回結(jié)果為7;

    func?demo4_2()?(num?int)?{
    ?num?=?10
    ?defer?func()?{
    ?????num?+=?5
    ?}()
    
    ?return?2}//?7

再來看一個(gè)例子。
在 demo4_3 中,函數(shù)使用匿名返回值

func?demo4_3()?int?{
?num?:=?10
?defer?func()?{
?????num?+=?5
?}()

?return?2}//?2
defer ???? ????? ??? ??? ??? ????? ?? ???? ?? ???? ?? ??? ????. defer? ???? ???? ??? ?? ??? ???? ?? ?? ??? ?? ???. ??? defer? 5?? ?? ??? ????, 8?? ??? ?? defer? ??? ????? ??????.
  1. ?? 1: ?? defer ?? ? ?? ??: ??, ??

    ?? defer ???? ???? ?? ?? ??? defer ?? ??? ?????. "??" ??, ?? ??? ????? ? ?? ??? ???? ????. ?? ??? ???? ?? ??? ??? ? ???? ??? ???? ?????.
  2. func?demo5_1()?{
    ?defer?fmt.Println(1)
    ?defer?fmt.Println(2)
    ?defer?fmt.Println(3)
    
    ?panic("沒點(diǎn)贊異常")?//?觸發(fā)defer出棧執(zhí)行
    
    ?defer?fmt.Println(4)?//?得不到執(zhí)行}
  3. ?? 2: ??? ?? ????, ???? ?? ?? ??? ????

    Demo2? ???? ? ?? ?? ??? ? ?? ?? ??? ??? ???? ??? ? ? ????. ??? ????.
    defer? ??? ?? ????? ?? ??? ??? ????? ???? ?? ?? defer ??? ????.
  4. func?demo5_2()?{
    ?defer?func()?{
    ?????if?err?:=?recover();?err?!=?nil?{
    ?????????fmt.Println(err,?"問題不大")
    ?????}
    ?}()
    
    ?panic("沒點(diǎn)贊異常")?//?觸發(fā)defer出棧執(zhí)行
    
    ?//?...}
  5. ?? 3: ?? ? ?? ????? ?? ? ?????(?? ??? ????)

    demo3_1? ???? ??? ?? ??? ? ??: defer ?? ???? n? ?? ??? ?? ?? ?? ??????? ??? ?? num? ???? ??? ?? ????. ?? ??.
  6. rrreee
  7. demo3_2? ?????. ??? defer? ?? ?? ??? ? ?? num? ???? ??? ???? ???? ?????.
    defer ???? ?? ???? p ???? ???? ??? ???? ?? num? ???? ??? ?? num? ?????. ??? defer? ???? ??? p ???? ???? ?? num? ?? ????.

    rrreee

    defer3_3? ?? ???. defer? ??? ??? ?? ????? ?? ???? ????. "?? ??" num? defer???? ?? ????? defer? ?? ??? ?????. ?? num? ?????.
  8. rrreee
  9. ?? 4: return ? defer ?? ??: return ?? defer? ??

    demo4_1? ???? defer ? return? ?? ??? ????? return? defer?? ?? ???? ?? ? ? ????.

    rrreee

    ???; ?? ???? ? ? ??? ??? ?? ? ??? ?? ??? **?? ?? ?** "??"? ???? ?? ??? ????? ?????.
    demo4_2?? ??? ??? ?? ?? ???? ?? ?? ??? 7???. ?? ????? ?????.

    (? ??) num ??? ?? ??? ???? ?? ?? 0???.

    (? ??) num ???? 10 ?? ?????.

  10. (then) return ? ?? num? ?? ??? 2? ??????.
?????? (Then) return ? defer? ????, ??? ?? ?? num? ????. , ?? 7???. ???????? (?????) ?? num? ?? ??? ???? ?? ?? ?? ??? 7???. ??rrreee?????? ? ?? ?? ???????.
demo4_3?? ??? ?? ?? ?? ???? ?? ?? ??? 2???. ????? ??? ????. ????????? ??? ???? ?? ? ??? ?? ???? ????. ????????? ?? num? ???? ????????? ??? ? ? 10? ?????. ?? ?? ? ??? ???? ?? 2? ?????. ? ?? ? ??? ?? ?? ?? ?? a, b, c, d...? ??? ? ??? ????? ?? ?? num? ????. ????defer, ?? num? ??? ?????? ?? ?? ??? ??? ??? ????. ??????????? ?? ?? ?? ??? 2???. ??rrreee??Feature 5: ??? ???? ?????. defer? ???? ???? ?????. ????demo5_1? ???? ??? ???? ??? defer? ???? ???? ? ??? ???? ?? ??? ??? defer? ???? ?? ?? ? ? ????. ??rrreee?? ? ??? ???? ??? ???? ??? ???? ???? ??? ??? ? ????. ??rrreee?????????? ??: ??github.com/newbugcoder/learngo/tre...????????

? ??? 8?? ??? ???? Go ?? ??? 5?? ?? ??? ?????? ?? ?????. ??? ??? PHP ??? ????? ?? ?? ??? ?????!

? ????? ??
? ?? ??? ????? ???? ??? ??????, ???? ?????? ????. ? ???? ?? ???? ?? ??? ?? ????. ???? ??? ???? ???? ??? ?? admin@php.cn?? ?????.

? AI ??

Undresser.AI Undress

Undresser.AI Undress

???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover

AI Clothes Remover

???? ?? ???? ??? AI ?????.

Video Face Swap

Video Face Swap

??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

???

??? ??

???++7.3.1

???++7.3.1

???? ?? ?? ?? ???

SublimeText3 ??? ??

SublimeText3 ??? ??

??? ??, ???? ?? ????.

???? 13.0.1 ???

???? 13.0.1 ???

??? PHP ?? ?? ??

???? CS6

???? CS6

??? ? ?? ??

SublimeText3 Mac ??

SublimeText3 Mac ??

? ??? ?? ?? ?????(SublimeText3)

???

??? ??

??? ????
1601
29
PHP ????
1502
276
???
Redis Stream? ???? GO Language?? ??? ???? ??? ? User_ID ?? ?? ??? ???? ??? ?????? Redis Stream? ???? GO Language?? ??? ???? ??? ? User_ID ?? ?? ??? ???? ??? ?????? Apr 02, 2025 pm 04:54 PM

Go Language?? ??? ???? ???? ?? Redisstream? ???? ??? Go Language? Redis? ???? ???? ...

???? ??? ?? ?? ???? ???? ??? ????????? ???? ??? ?? ?? ???? ???? ??? ????????? Apr 02, 2025 pm 05:09 PM

???? ??? ?? ?? ???? ???? ??? ????????? Go Language ??? ?? Goland? ??? ? ?? ???? ??? ?? ?? ??? ?? ???? ...

GO? ?? ?????? ????? ????? ? ??? ?? ?? ?????? ?????? GO? ?? ?????? ????? ????? ? ??? ?? ?? ?????? ?????? Apr 02, 2025 pm 04:12 PM

GO? ?? ?????? ????? ? ??? ?? ?? ?????? ?? ????? GO? ????? ? ? ???? ?? ? ?? ???? ??? ????.

GO? ???? Oracle ??????? ??? ? Oracle ?????? ???????? GO? ???? Oracle ??????? ??? ? Oracle ?????? ???????? Apr 02, 2025 pm 03:48 PM

GO? ???? Oracle ??????? ??? ? Oracle ?????? ???????? GO?? ??? ? Oracle ??????? ???? ?? ???? ?? ????? ...

GO ??????? MySQL? Redis ?? ??? ???? ???? ????? ??? ?????? GO ??????? MySQL? Redis ?? ??? ???? ???? ????? ??? ?????? Apr 02, 2025 pm 05:03 PM

GO ?????? ?? ?? : MySQL ? Redis? ?? ?????? ? ??? ?? ???? ???? ???? ??? ??? ? ?? ? ??? ...

Centos PostgreSQL ??? ???? Centos PostgreSQL ??? ???? Apr 14, 2025 pm 05:57 PM

CentOS ??? ?? PostgreSQL ?????? ??? ???? ??? ?? ??? ??? ??? CentOS ????? PostgreSQL ?????? ???? ?????? ??? ??? ???? ??? ?? ??? ??? ???? ??? ? ??? ?????. 1. PostgreSQL ?? ?? ??? PostgreSQL?? ?? ? ?? ????? ?? ??? ??? ??? ?? ? ?? ?????. PG_STAT_ACTIVITY : ?? ??? ? ?? ? ?? ???????. PG_STAT_STATEMENTS : SQL ? ??? ???? ?? ?? ?? ??? ??????. PG_STAT_DATABASE : ???? ???, ?? ??? ?? ?????? ?? ??? ?????.

Go ? Viper ?????? ??? ? ???? ?? ???? ??? ?????? Go ? Viper ?????? ??? ? ???? ?? ???? ??? ?????? Apr 02, 2025 pm 04:00 PM

Go Pointer Syntax ? Viper Library ??? ?? ?? GO ??? ????? ? ? ?? ???? ?? ? ???? ???? ?? ?????.

GO ? ?? ?? : ?? ?? GO ? ?? ?? : ?? ?? Apr 28, 2025 am 12:17 AM

goistrongchoiceforprojectsneedingsimplicity, performance, and concurrency, butitmaylackinadvancedfeaturesandecosystemmaturity.1) go'ssyntaxissimpleandeasytolearn, go'ssyntaxissimpleandeasytolearn, theadtofewerbugsandmoremaintainablecode, theitlacksfeaturecomecemememecememememecememememememememememecemememememecemememecemememecemememecemecemecode

See all articles