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

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

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

引言

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

defer 常見用法

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

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

輸出結(jié)果:

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

那 defer 在 Go 里的常見用法有哪些呢?首先是上文用到的,直接 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)
    ....
}

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

新提案:defer 代碼塊

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

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

defer f()

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

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

基于上述類似的原因,想引入如下具有 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)然,這看著似乎是比較美好的??雌饋碓岚缸髡咧皇呛?jiǎn)化了 defer 是的閉包使用,調(diào)整了作用域的范圍。

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

1、收益比不高:這個(gè)提案只是避免了 func() 和 () 等閉包聲明,但是卻要增加新的 defer 語(yǔ)法(語(yǔ)言語(yǔ)法更改會(huì)帶來高昂成本),這個(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、作用域問題:原本 defer func{}() 的代碼塊結(jié)構(gòu)下,你的代碼作用域都限于閉包函數(shù)下。而使用新的 defer {} 的結(jié)構(gòu),該返回和操作,是否應(yīng)該會(huì)影響到外部函數(shù)的結(jié)果?(這是最有爭(zhēng)議的一點(diǎn),作者也比較前言不搭后語(yǔ),沒明確指明語(yǔ)法意思)

總結(jié)

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

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

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

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

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

相關(guān)文章

  • 詳解Golang中channel的實(shí)現(xiàn)

    詳解Golang中channel的實(shí)現(xiàn)

    channel俗稱管道,用于數(shù)據(jù)傳遞或數(shù)據(jù)共享,其本質(zhì)是一個(gè)先進(jìn)先出的隊(duì)列,使用goroutine+channel進(jìn)行數(shù)據(jù)通訊簡(jiǎn)單高效,同時(shí)也線程安全,本文就給大家講講Golang中channel的實(shí)現(xiàn),需要的朋友可以參考下
    2023-09-09
  • 淺析Go中序列化與反序列化的基本使用

    淺析Go中序列化與反序列化的基本使用

    序列化是指將對(duì)象轉(zhuǎn)換成字節(jié)流,從而存儲(chǔ)對(duì)象或?qū)?duì)象傳輸?shù)絻?nèi)存、數(shù)據(jù)庫(kù)或文件的過程,反向過程稱為“反序列化”。本文主要介紹了Go中序列化與反序列化的基本使用,需要的可以參考一下
    2023-04-04
  • golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式

    golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式

    這篇文章主要介紹了golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • GO語(yǔ)言實(shí)現(xiàn)文件上傳代碼分享

    GO語(yǔ)言實(shí)現(xiàn)文件上傳代碼分享

    本文給大家分享的是一則使用golang實(shí)現(xiàn)文件上傳的代碼,主要是使用os.Create創(chuàng)建文件,io.Copy來保存文件,思路非常清晰,這里推薦給大家,有需要的小伙伴參考下吧。
    2015-03-03
  • 詳解Go語(yǔ)言的內(nèi)存模型及堆的分配管理

    詳解Go語(yǔ)言的內(nèi)存模型及堆的分配管理

    這篇筆記主要介紹Go內(nèi)存分配和Go內(nèi)存管理,會(huì)輕微涉及內(nèi)存申請(qǐng)和釋放,以及Go垃圾回收,文中有詳細(xì)的代碼示例以及圖片介紹,需要的朋友可以參考下
    2023-05-05
  • golang字符串轉(zhuǎn)Time類型問題

    golang字符串轉(zhuǎn)Time類型問題

    本文主要介紹了golang字符串轉(zhuǎn)Time類型問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 深入理解Go語(yǔ)言中的Dispatcher

    深入理解Go語(yǔ)言中的Dispatcher

    最近看到了Go語(yǔ)言中的Dispatcher,但是在網(wǎng)上發(fā)現(xiàn)資料非常少,所以想著總結(jié)處理分享給大家,下面這篇文章主要給大家深入的介紹Go語(yǔ)言中Dispatcher的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • 深入理解gorm如何和數(shù)據(jù)庫(kù)建立連接

    深入理解gorm如何和數(shù)據(jù)庫(kù)建立連接

    這篇文章主要為大家詳細(xì)介紹了gorm如何和數(shù)據(jù)庫(kù)建立連接,文中的示例代碼講解詳細(xì),對(duì)我們深入了解GO語(yǔ)言有一定的幫助,需要的小伙伴可以參考下
    2023-11-11
  • golang中日期操作之日期格式化及日期轉(zhuǎn)換

    golang中日期操作之日期格式化及日期轉(zhuǎn)換

    在編程中,程序員會(huì)經(jīng)常使用到日期相關(guān)操作,下面這篇文章主要給大家介紹了關(guān)于golang中日期操作之日期格式化及日期轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀

    Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀

    這篇文章主要為大家介紹了Golang標(biāo)準(zhǔn)庫(kù)unsafe源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論