日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

解密defer語句:避免踩坑,掌握延遲執行的正確姿勢

來源: 責編: 時間:2023-11-19 10:30:28 278觀看
導讀基本概念Go語言的延遲語句defer有哪些特點?通常在什么情況下使用?Go語言的延遲語句(defer statement)具有以下特點:延遲執行:延遲語句會在包含它的函數執行結束前執行,無論函數是正常返回還是發生異常。后進先出:如果有多個


1Pw28資訊網——每日最新資訊28at.com

基本概念

Go語言的延遲語句defer有哪些特點?通常在什么情況下使用?1Pw28資訊網——每日最新資訊28at.com

Go語言的延遲語句(defer statement)具有以下特點:1Pw28資訊網——每日最新資訊28at.com

  1. 延遲執行:延遲語句會在包含它的函數執行結束前執行,無論函數是正常返回還是發生異常。
  2. 后進先出:如果有多個延遲語句,它們會按照后進先出(LIFO)的順序執行。也就是說,最后一個延遲語句會最先執行,而第一個延遲語句會最后執行。

通常情況下,延遲語句在以下情況下使用:1Pw28資訊網——每日最新資訊28at.com

  1. 資源釋放:延遲語句可以用于在函數返回前釋放打開的文件、關閉數據庫連接、釋放鎖等資源,以確保資源的正確釋放,避免資源泄漏。
  2. 錯誤處理:延遲語句可以用于處理函數執行過程中可能發生的錯誤。通過在函數開始時設置延遲語句,在函數返回前檢查錯誤并進行相應的處理,可以簡化錯誤處理的邏輯。
  3. 日志記錄:延遲語句可以用于在函數返回前記錄日志或執行其他的調試操作,以便在函數執行過程中收集相關的信息。

延遲語句的使用可以提高代碼的可讀性和可維護性,同時確保資源的釋放和清理操作按照逆序進行。它是Go語言中一種常用的編程技巧,用于處理資源管理和錯誤處理等場景。1Pw28資訊網——每日最新資訊28at.com

避坑之旅

實際開發中defer的使用并不像前面介紹的這么簡單,defer用不好,會陷入泥潭。1Pw28資訊網——每日最新資訊28at.com

下面我從兩個角度帶大家避坑:1Pw28資訊網——每日最新資訊28at.com

  1. 首先拆解一下延遲語句的執行,注意Go語言的return語句不是原子性的;
  2. 另外重點和大家分享一下defer語句后面使用匿名函數和非匿名函數的區別。

拆解延遲語句

避免陷入泥潭的關鍵是必須深刻理解下面這條語句:1Pw28資訊網——每日最新資訊28at.com

return xxx

上面這條語句經過編譯之后,實際上生成了三條指令:1Pw28資訊網——每日最新資訊28at.com

1)返回值 =xxx。1Pw28資訊網——每日最新資訊28at.com

2)調用 defer 函數。1Pw28資訊網——每日最新資訊28at.com

3)空的 return。1Pw28資訊網——每日最新資訊28at.com

第1和第 3 步是return語句生成的指令,也就是說return并不是一條原子指令;1Pw28資訊網——每日最新資訊28at.com

第2步是 defer 定義的語句,這里可能會操作返回值,從而影響最終結果。1Pw28資訊網——每日最新資訊28at.com

下面來看兩個例子,試著將return 語句和 defer語句拆解到正確的順序。1Pw28資訊網——每日最新資訊28at.com

第一個例子:

func f()(r int){  t:=5  defer func(){    t=t+5    }()      return t}

拆解后:1Pw28資訊網——每日最新資訊28at.com

func f()(r int){  t:=5    //1,賦值指令  r=t  // 2.defer 被插入到賦值與返回之間執行,這個例子中返回值r沒被修改過   func(){    t=t+5    }()      //3.空的 return 指令  return  }

這里第二步實際上并沒有操作返回值r,因此,main函數中調用f()得到5。1Pw28資訊網——每日最新資訊28at.com

圖片圖片1Pw28資訊網——每日最新資訊28at.com

第二個例子:

func f()(r int){  defer func(r int){    r=r+5    }(r)        return 1}

拆解后:1Pw28資訊網——每日最新資訊28at.com

func f() (r int) {  //1.賦值   r=1    //2.這里改的r是之前傳進去的r,不會改變要返回的那個r值   func(r int) {    r=r+5  }(r)    // 3. 空的 return   return}

第二步,改變的是傳值進去的r,是形參的一個復制值,不會影響實參r。因此,main函數中需要調用f()得到1。1Pw28資訊網——每日最新資訊28at.com

圖片圖片1Pw28資訊網——每日最新資訊28at.com


1Pw28資訊網——每日最新資訊28at.com

在使用匿名函數和非匿名函數作為defer的參數時,主要區別在于對函數參數的傳遞和作用域的影響:1Pw28資訊網——每日最新資訊28at.com

  1. 匿名函數作為defer的參數:匿名函數可以直接在defer語句中定義,可以訪問外部函數的變量,并且在執行時會使用當前的變量值。這種方式可以方便地在defer語句中使用外部變量,但需要注意變量的值在執行時可能已經發生了改變。
  2. 非匿名函數作為defer的參數:非匿名函數需要先定義好,然后作為defer的參數傳遞。在執行時,會使用函數的當前參數值。這種方式可以在defer語句中使用已定義的函數,但需要注意函數參數的傳遞和作用域。

產生這種區別的原因是,匿名函數和非匿名函數在定義和作用域上的差異。匿名函數可以直接在defer語句中定義,可以訪問外部函數的變量,而非匿名函數需要先定義好,然后作為參數傳遞。這種設計靈活性使得開發者可以根據具體的需求選擇合適的方式來使用defer語句。1Pw28資訊網——每日最新資訊28at.com

舉例來說

當使用匿名函數作為defer的參數時,可以在defer語句中直接定義匿名函數,并訪問外部變量。1Pw28資訊網——每日最新資訊28at.com

以下是一個示例代碼:1Pw28資訊網——每日最新資訊28at.com

package mainimport "fmt"func main() {    x := 10    defer func() {        fmt.Println("Deferred anonymous function:", x)    }()    x = 20    fmt.Println("Before return:", x)}

在上述示例中,匿名函數作為defer的參數,可以訪問外部變量x。在函數返回之前,defer語句中的匿名函數會執行,并打印出x的值。1Pw28資訊網——每日最新資訊28at.com

輸出結果如下:1Pw28資訊網——每日最新資訊28at.com

圖片圖片1Pw28資訊網——每日最新資訊28at.com

當使用非匿名函數作為defer的參數時,需要先定義好函數,然后將函數名作為defer的參數傳遞。1Pw28資訊網——每日最新資訊28at.com

以下是一個示例代碼:1Pw28資訊網——每日最新資訊28at.com

package mainimport "fmt"func main() {    x := 10    defer printX(x)    x = 20    fmt.Println("Before return:", x)}func printX(x int) {    fmt.Println("Deferred function:", x)}

在上述示例中,printX函數作為defer的參數傳遞,函數定義在main函數之后。1Pw28資訊網——每日最新資訊28at.com

在函數返回之前,defer語句中的printX函數會執行,并打印出傳遞的參數x的值。輸出結果如下:1Pw28資訊網——每日最新資訊28at.com

圖片圖片1Pw28資訊網——每日最新資訊28at.com

總結一下

通過以上示例,我們可以明確體現出使用匿名函數和非匿名函數作為defer的參數的區別。1Pw28資訊網——每日最新資訊28at.com

匿名函數可以直接在defer語句中定義,并訪問外部變量,而非匿名函數需要先定義好函數,然后將函數名作為參數傳遞。1Pw28資訊網——每日最新資訊28at.com

通過前面帶著大家拆解了defer的語句的執行,相信大家可以更好的理解了。1Pw28資訊網——每日最新資訊28at.com

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「  王中陽Go」,可以通過以下二維碼關注。1Pw28資訊網——每日最新資訊28at.com

1Pw28資訊網——每日最新資訊28at.com

轉載本文請聯系「 程序員升級打怪之旅」公眾號。1Pw28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-30059-0.html解密defer語句:避免踩坑,掌握延遲執行的正確姿勢

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Angular怎么還沒死

下一篇: 領克 04 全地形越野自行車發布:喜德盛開發、X6 鋁合金車架,售 3299 元

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己“當家”的盒馬,開始加速謀生了。據盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經與
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發搭載了聯發科天璣9200+旗艦
  • 到手價3099元起!iQOO Neo8 Pro今日首銷:安卓性能最強旗艦

    5月23日,iQOO如期舉行了新品發布會,全新的iQOO Neo8系列也正式與大家見面,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更
Top 主站蜘蛛池模板: 澳门| 武定县| 花垣县| 余姚市| 安顺市| 北川| 宕昌县| 南涧| 开平市| 宣恩县| 铜陵市| 霍州市| 基隆市| 美姑县| 西平县| 胶南市| 房山区| 建始县| 祥云县| 乌兰浩特市| 象州县| 垣曲县| 来凤县| 许昌市| 武定县| 南川市| 阿克陶县| 新巴尔虎右旗| 湘潭县| 盖州市| 原平市| 弥勒县| 六枝特区| 兴义市| 海阳市| 霍州市| 江永县| 扎兰屯市| 兴和县| 芒康县| 东阿县|