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

Go?defer?去掉閉包函數(shù)及用法分析

 更新時(shí)間:2023年07月13日 09:51:50   作者:煎魚(yú)  
這篇文章主要為大家介紹了Go?defer?去掉閉包函數(shù)及用法分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

在 Go 語(yǔ)言里,defer 關(guān)鍵字是大家很愛(ài)用的。因?yàn)樗兄?defer+recover+panic 的組合拳打法,還有種各種 defer close 等常用場(chǎng)景。

defer 常見(jiàn)用法

在語(yǔ)法上,Go defer 的代碼示例如下:

package main
import "fmt"
func main() {
    defer fmt.Println("煎魚(yú)你好!")
    fmt.Println("放學(xué)別走")
}

輸出結(jié)果:

放學(xué)別走
煎魚(yú)你好!

那 defer 在 Go 里的常見(jiàn)用法有哪些呢?首先是上文用到的,直接 defer + 函數(shù):

defer f()

其次是 defer+閉包的方式:

defer func() { 
   result := f()
   // do something with result
}()

其他還有在面試題上常被考究的傳參變形:

func f1() int {
    i := 1
    defer func() {
        i++
    }()
    ...
}
func f2() int {
    i := 1
    defer func(i int) {
        i++
    }(i)
    ....
}

這些代碼看起來(lái),我們總是在對(duì) defer 做閉包的各種聲明和使用。defer 會(huì)不會(huì)就是和閉包天生一對(duì)?

新提案:defer 代碼塊

最近大家也在討論一個(gè)與之相關(guān)的 Go 提案《proposal: Go 2: deferred code blocks》,由 @Damien Lloyd 提出,想看看有沒(méi)有機(jī)會(huì)把 defer 的新語(yǔ)法落地。

原作者在使用 defer 時(shí)也是經(jīng)常:

defer f()

但這樣就無(wú)法獲得返回值。最終要變成:

defer func() { 
   result := f()
   // do something with result
}()

基于上述類(lèi)似的原因,想引入如下具有 defer 作用的代碼塊語(yǔ)法:

defer {
   // 在封閉函數(shù)的末尾執(zhí)行此操作
}

在使用了 defer 關(guān)鍵字的函數(shù)最后執(zhí)行這整個(gè)代碼塊 {...}。代碼塊中的每一行將按順序運(yùn)行。

作者給出的代碼示例:

func fn() {
    f, err := os.Create("eddycjy.txt")
    if err != nil {
        panic(err)
    }
    defer {
       err := f.Close()
       if err != nil {
          panic(err)
       }
    }
}

在 fn 函數(shù),聲明了 defer {...},代碼塊內(nèi)是對(duì) f.Close 的兜底判斷和異常拋出。在函數(shù)結(jié)束后執(zhí)行這整個(gè)代碼塊。

反對(duì)的聲音

當(dāng)然,這看著似乎是比較美好的??雌饋?lái)原提案作者只是簡(jiǎn)化了 defer 是的閉包使用,調(diào)整了作用域的范圍。

但在社區(qū)內(nèi)其實(shí)遭受比較多的反對(duì)聲音。包含但不限于:

1、收益比不高:這個(gè)提案只是避免了 func() 和 () 等閉包聲明,但是卻要增加新的 defer 語(yǔ)法(語(yǔ)言語(yǔ)法更改會(huì)帶來(lái)高昂成本),這個(gè)變更的 ROI 不高。

2、破壞兼容性:原 defer 關(guān)鍵字調(diào)用總是會(huì)跟著函數(shù)的詞法調(diào)用,有良好的一致性。如果進(jìn)行修改,會(huì)產(chǎn)生新的隱晦,破壞一致性。也會(huì)對(duì)現(xiàn)有的許多工具(例如:靜態(tài)分析工具)產(chǎn)生影響,全要改。

3、作用域問(wèn)題:原本 defer func{}() 的代碼塊結(jié)構(gòu)下,你的代碼作用域都限于閉包函數(shù)下。而使用新的 defer {} 的結(jié)構(gòu),該返回和操作,是否應(yīng)該會(huì)影響到外部函數(shù)的結(jié)果?(這是最有爭(zhēng)議的一點(diǎn),作者也比較前言不搭后語(yǔ),沒(méi)明確指明語(yǔ)法意思)

總結(jié)

一開(kāi)始乍一眼一看,感覺(jué)只是把 defer 關(guān)鍵字語(yǔ)句簡(jiǎn)化一下,好像特別好,省了幾個(gè)單詞。就像 if err != nil 也會(huì)有提要用 Rust 的 ? 等用法來(lái)替代的。

經(jīng)過(guò)社區(qū)網(wǎng)友們指出后,發(fā)現(xiàn)這里貓膩不少。一門(mén)已經(jīng)有 10+ 年的編程語(yǔ)言,還有 Go1 兼容性保障的。做出這類(lèi)帶作用域的提案變更,是有比較大的風(fēng)險(xiǎn)的。

同時(shí)對(duì)于 Go 工具鏈的影響,也是非常大的。一改,直接都完?duì)僮恿恕4_實(shí)需要盡量深思。原作者完全沒(méi)提到。

該提案,正在開(kāi)放 3 周等待意見(jiàn)收集。很神奇,沒(méi)更多的人說(shuō)話(huà),但提案的表情給了很多個(gè)不認(rèn)同。

以上就是Go defer 去掉閉包函數(shù)及用法分析的詳細(xì)內(nèi)容,更多關(guān)于Go defer閉包函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言中 Channel 詳解

    Go語(yǔ)言中 Channel 詳解

    Go 語(yǔ)言中的 channel 是實(shí)現(xiàn) goroutine 間無(wú)鎖通信的關(guān)鍵機(jī)制,他使得寫(xiě)多線(xiàn)程并發(fā)程序變得簡(jiǎn)單、靈活、觸手可得。下面就個(gè)人理解對(duì) channel 使用過(guò)程中應(yīng)該注意的地方進(jìn)行一個(gè)簡(jiǎn)要的總結(jié)。
    2018-10-10
  • golang高并發(fā)限流操作 ping / telnet

    golang高并發(fā)限流操作 ping / telnet

    這篇文章主要介紹了golang高并發(fā)限流操作 ping / telnet,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go?json自定義Unmarshal避免判斷nil示例詳解

    Go?json自定義Unmarshal避免判斷nil示例詳解

    這篇文章主要為大家介紹了Go?json自定義Unmarshal避免判斷nil示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go Generate 代替 Makefile使用方法詳解

    Go Generate 代替 Makefile使用方法詳解

    這篇文章主要為大家介紹了Go Generate 代替 Makefile使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • go語(yǔ)言面試如何實(shí)現(xiàn)自旋鎖?

    go語(yǔ)言面試如何實(shí)現(xiàn)自旋鎖?

    這篇文章主要為大家介紹了go語(yǔ)言面試中常問(wèn)的如何實(shí)現(xiàn)自旋鎖問(wèn)題實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • Golang中切片長(zhǎng)度和容量的區(qū)別示例詳解

    Golang中切片長(zhǎng)度和容量的區(qū)別示例詳解

    切片長(zhǎng)度與容量在Go中很常見(jiàn),切片長(zhǎng)度是切片中可用元素的數(shù)量,而切片容量是從切片中第一個(gè)元素開(kāi)始計(jì)算的底層數(shù)組中的元素?cái)?shù)量,這篇文章主要給大家介紹了關(guān)于Golang中切片長(zhǎng)度和容量區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Go語(yǔ)言包管理工具Godep的用法

    Go語(yǔ)言包管理工具Godep的用法

    這篇文章介紹了Go語(yǔ)言包管理工具Godep的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Go語(yǔ)言中的日期與時(shí)間用法詳細(xì)介紹

    Go語(yǔ)言中的日期與時(shí)間用法詳細(xì)介紹

    Go語(yǔ)言提供了豐富的日期與時(shí)間處理函數(shù),涵蓋了從獲取當(dāng)前時(shí)間到格式化、時(shí)區(qū)轉(zhuǎn)換、定時(shí)器和計(jì)時(shí)器的功能,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中日期與時(shí)間用法的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • Go ORM的封裝解決方式詳解

    Go ORM的封裝解決方式詳解

    這篇文章主要為大家介紹了Go ORM的封裝解決方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Golang::slice和nil的對(duì)比分析

    Golang::slice和nil的對(duì)比分析

    這篇文章主要介紹了Golang::slice和nil的對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論

清丰县| 盐津县| 景泰县| 沅江市| 嵩明县| 仁寿县| 且末县| 黄梅县| 锦州市| 兴义市| 永善县| 虎林市| 光泽县| 横山县| 嘉兴市| 措勤县| 静乐县| 沁阳市| 海晏县| 营口市| 琼中| 莱西市| 武胜县| 鄂托克旗| 九龙城区| 临朐县| 股票| 天门市| 烟台市| 东海县| 梁平县| 吉木乃县| 社旗县| 迭部县| 清河县| 徐州市| 咸丰县| 绥江县| 三门峡市| 金昌市| 南昌市|