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

Go語言中defer語句的用法

 更新時間:2022年07月16日 17:28:10   作者:奮斗的大橙子  
這篇文章介紹了Go語言中defer語句的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

可以用作一些資源的釋放。

1.在一個函數(shù)內(nèi)的defer執(zhí)行順序是先寫的后執(zhí)行,后寫的先執(zhí)行(遵循棧結(jié)構)

func DeferTest1(){
   defer fmt.Println("我是 defer1")
   defer fmt.Println("我是 defer2")
   fmt.Println("我是DeferTest1")
   fmt.Println("我是DeferTest2")
}

結(jié)果:

我是DeferTest1
我是DeferTest2
我是 defer2
我是 defer1

2.defer 執(zhí)行語句的值和定義defer語句函數(shù)的關系

func DeferTest2(){
   i:= 0
   defer fmt.Printf("defer i=%d\t",i)
   for ;i<=10;i++{
      fmt.Printf("i=%d\t",i)
   }
   fmt.Println()
}

執(zhí)行結(jié)果

i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 i=10   
defer i=0

3.defer的原理

首先看下defer和return語句的區(qū)別,如下

可以看到 return 執(zhí)行的時候 將結(jié)果x賦值給了返回值,然后執(zhí)行了RET指令,而defer語句執(zhí)行的時候,是在RET指令之前。所以這里注意一下。返回值和x的關系。如果x是一個值類型,這里是進行了拷貝的??梢钥聪孪旅鎺讉€例子:

func defer1() int {
  x := 1
  defer func() {
   x++<br data-filtered="filtered">  }()
  return x
}

func defer2() (x int) {
  defer func() {
    x++
  }()
  return 1
}

func defer3() (y int) {
  x := 1
  defer func() {
    x++
  }()
  return x
}

func defer4() (x int) {
  defer func(x int) {
    x++
    }(x)
    return 1
}

分別打印這幾個方法的結(jié)果,返回值分別如下:

defer1: 1
defer2: 2
defer3: 1
defer4: 1

根據(jù)上面圖上的解釋:

  • ①defer執(zhí)行之前,將x賦值給了返回值(這是一個值拷貝),然后修改x的值,對返回值是無影響的,所以返回的是1
  • ②返回值的名稱就是x,此時defer執(zhí)行前把x賦值為1,然后defer修改x的值, x被增加,故返回的是2
  • ③返回值名稱是y,defer執(zhí)行前,y被賦值為1,defer執(zhí)行修改x對y無影響,返回也是1
  • ④返回值名稱雖然是x,但是defer執(zhí)行的func是一個帶參數(shù)的函數(shù),此時傳入的參數(shù)x是一個值拷貝,作用域是內(nèi)部,對于外部的x無影響,所以返回的也是1

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接

相關文章

  • Go中使用單調(diào)時鐘獲得準確的時間間隔問題

    Go中使用單調(diào)時鐘獲得準確的時間間隔問題

    這篇文章主要介紹了Go中使用單調(diào)時鐘獲得準確的時間間隔,在go語言中,沒有直接調(diào)用時鐘的函數(shù),可以通過?time.Now()?獲得帶單調(diào)時鐘的?Time?結(jié)構體,并通過Since和Until獲得相對準確的時間間隔,需要的朋友可以參考下
    2022-06-06
  • Gin使用swagger生成接口文檔的代碼示例

    Gin使用swagger生成接口文檔的代碼示例

    Swagger 是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化 RESTful Web 服務,它使用 YAML 或 JSON 格式來定義 API 的結(jié)構,本文給大家介紹了Gin使用swagger生成接口文檔的代碼示例,需要的朋友可以參考下
    2024-06-06
  • golang中值類型/指針類型的變量區(qū)別總結(jié)

    golang中值類型/指針類型的變量區(qū)別總結(jié)

    golang的值類型和指針類型receiver一直是大家比較混淆的地方,下面這篇文章主要給大家總結(jié)介紹了關于golang中值類型/指針類型的變量區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • 使用go module導入本地包的方法教程詳解

    使用go module導入本地包的方法教程詳解

    go module 將是Go語言默認的依賴管理工具。到今天 Go1.14 版本推出之后 Go modules 功能已經(jīng)被正式推薦在生產(chǎn)環(huán)境下使用了。本文重點給大家介紹如何使用 go module 導入本地包,感興趣的朋友一起看看吧
    2020-03-03
  • Go語言的文件操作代碼匯總

    Go語言的文件操作代碼匯總

    本文給大家匯總介紹了go語言中的文件操作的代碼,包括文件的讀寫,文件的新建打開和刪除等,希望對大家學習go語言能夠有所幫助
    2018-10-10
  • Go語言基礎語法之結(jié)構體及方法詳解

    Go語言基礎語法之結(jié)構體及方法詳解

    結(jié)構體類型可以用來保存不同類型的數(shù)據(jù),也可以通過方法的形式來聲明它的行為。本文將介紹go語言中的結(jié)構體和方法,以及“繼承”的實現(xiàn)方法
    2021-09-09
  • Golang Cron 定時任務的實現(xiàn)示例

    Golang Cron 定時任務的實現(xiàn)示例

    這篇文章主要介紹了Golang Cron 定時任務的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • Golang Recover處理錯誤原理解析

    Golang Recover處理錯誤原理解析

    Golang 中的?recover?是一個鮮為人知但非常有趣和強大的功能,讓我們看看它是如何工作的,以及在 Outreach.io 中如何利用它來處理 Kubernetes 中的錯誤
    2023-12-12
  • Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實現(xiàn)

    Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實現(xiàn)

    這篇文章主要介紹了Go語言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Go語言字符串處理庫strings包詳解

    Go語言字符串處理庫strings包詳解

    本文詳細介紹了Go語言中的strings庫的使用方法,包括字符串的查找、替換、分割、比較、大小寫轉(zhuǎn)換等操作,strings庫是Go語言中非常重要且功能豐富的標準庫,幾乎涵蓋了所有字符串處理的需求
    2024-09-09

最新評論

沙湾县| 黔西| 南涧| 望奎县| 三亚市| 晋宁县| 峨眉山市| 离岛区| 阳城县| 徐闻县| 青田县| 长白| 蒲城县| 普格县| 深泽县| 康乐县| 蛟河市| 潮州市| 牡丹江市| 三穗县| 海伦市| 梁山县| 两当县| 南京市| 松滋市| 高密市| 九寨沟县| 巴里| 施甸县| 桃园县| 吉木萨尔县| 普洱| 昌都县| 越西县| 鄂托克前旗| 全州县| 长乐市| 根河市| 清丰县| 溧水县| 抚远县|