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

詳解Go中defer與return的執(zhí)行順序

 更新時間:2023年07月24日 10:24:56   作者:nil  
Go?defer中改變return的值會生效嗎,這就設計到了GO語言中defer與return哪個先執(zhí)行的問題了,下面小編就通過簡單的示例來和大家講講吧

示例

直接上代碼

func test() int {
   result = 123
   defer func() {
      result = 456
   }()
   return result
}
func main() {
   fmt.Println(test())
}

結果

123

修改之后的代碼

func test() (result int) {
   result = 123
   defer func() {
      result = 456
   }()
   return result
}
func main() {
   fmt.Println(test())
}

結果

456

再看下面這個例子

func test() (result int) {
   result = 123
   defer func() {
      fmt.Println("aaa")
      result = 456
   }()
   return func() int {
      fmt.Println("bbb")
      return result
   }()
}
func main() {
   fmt.Println(test())
}

結果

bbb
aaa
456

defer與return哪個先執(zhí)行

這個問題主要是defer 與return哪個先執(zhí)行。很容易理解如果一個函數(shù)中有多個defer,它是棧的形式保存的,執(zhí)行的時候先從棧頂執(zhí)行,即后面定義的defer會先被執(zhí)行,并且defer是在return執(zhí)行之后才執(zhí)行的。

因為defer是在return 執(zhí)行之后才執(zhí)行的,所以第三個例子中先打印bbb后打印aaa很好理解。

第二個例子和第三個例子test函數(shù)返回456也好理解,因為defer可以改變返回值中定義的變量。雖然return已經(jīng)返回了,defer還是可以改變它。

第一個例子,defer改變的不是返回值中定義的變量,而是局部變量,這個時候return已經(jīng)執(zhí)行了,defer改變局部變量沒有用。在defer中改變局部變量的值沒有效果。第一個例子return result是值拷貝,即將result的值拷貝一份并返回,因此defer改變result并不會影響返回值。

第二、第三例子中return返回的result不是值拷貝,因為result是在返回值中定義的變量,所以return返回的直接是那個變量,這個時候沒有值拷貝

再看看下面這個例子

func test() *int {
   result := 123
   defer func() {
      result = 456
   }()
   return &result
}
func main() {
   fmt.Println(*test())
}

結果

456

這個時候defer改變局部變量result又生效了,這是為什么?是因為return 返回的是局部變量的地址,而不是局部變量的只拷貝。因此在defer中修改局部遍歷會影響返回結果。

總結

上面描述可能有點繞,需要親自實驗一下,仔細理解才能真正搞懂。下面總結一下我的理解:

return 返回有2種方式:

值拷貝:將局部變量的值拷貝到返回值上。return 直接返回局部變量的值(不是局部變量的引用)

非值拷貝:即return 返回值的時候沒有發(fā)生值拷貝,有兩種情況:

  • 將返回值中定義的變量返回。
  • 將局部變量的引用返回。

非值拷貝的情況下,defer修改返回值是生效的。

return 的執(zhí)行其實用兩步驟:1.先將return的結果賦值到返回值上;2.再將返回值賦值作為函數(shù)的結果賦值給調用者。

defer的執(zhí)行是在return的兩步驟中間執(zhí)行的。所以return如果發(fā)生了值拷貝則defer不會改變返回結果;如果return沒有發(fā)生值拷貝則defer會改變返回結果。

到此這篇關于詳解Go中defer與return的執(zhí)行順序的文章就介紹到這了,更多相關Go defer return內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go操作Kafka和Etcd方法詳解

    Go操作Kafka和Etcd方法詳解

    這篇文章主要為大家介紹了Go操作Kafka和Etcd方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Golang 實現(xiàn)超大文件讀取的兩種方法

    Golang 實現(xiàn)超大文件讀取的兩種方法

    這篇文章主要介紹了Golang 實現(xiàn)超大文件讀取的兩種方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語言中函數(shù)的使用方法詳解

    Go語言中函數(shù)的使用方法詳解

    這篇文章主要為大家詳細介紹了Go語言中函數(shù)的使用方法的相關資料,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,感興趣的可以了解一下
    2023-04-04
  • 使用go求冪的幾種方法小結

    使用go求冪的幾種方法小結

    這篇文章主要介紹了使用go求冪的幾種方法小結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go panic時如何讓函數(shù)返回數(shù)據(jù)?

    go panic時如何讓函數(shù)返回數(shù)據(jù)?

    今天小編就為大家分享一篇關于go panic時如何讓函數(shù)返回數(shù)據(jù)?,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Golang中NetPoll機制的實現(xiàn)

    Golang中NetPoll機制的實現(xiàn)

    本文主要介紹了Golang中NetPoll機制的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-12-12
  • 5個可以在Golang中優(yōu)化代碼以提高性能的技巧分享

    5個可以在Golang中優(yōu)化代碼以提高性能的技巧分享

    作為一名軟件工程師,確保你的代碼高效且性能良好是非常重要的。本文主要和大家分享5個可以在Golang中優(yōu)化代碼以提高性能的技巧,希望對大家有所幫助
    2023-03-03
  • go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟

    go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟

    這篇文章主要介紹了go語言實戰(zhàn)之實現(xiàn)比特幣地址校驗步驟,利用生產(chǎn)的隨機數(shù)采用橢圓加密算法生成公鑰,具體步驟實例代碼請參考下本文
    2021-05-05
  • Golang 使用事務的簡單實踐

    Golang 使用事務的簡單實踐

    事務是保證數(shù)據(jù)一致性的重要手段,在Golang項目中,我們可以通過事務管理器或GORM的來簡化事務的使用,本文就來詳細的介紹一下Golang 使用事務的實現(xiàn)示例,感興趣的可以了解一下
    2025-11-11
  • golang net.url標準庫的具體使用

    golang net.url標準庫的具體使用

    本文主要介紹了golang net.url標準庫的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-06-06

最新評論

临武县| 长海县| 庆元县| 兴和县| 福安市| 临泽县| 东阿县| 盐池县| 施秉县| 宁城县| 平邑县| 扶沟县| 乾安县| 海南省| 弥渡县| 曲麻莱县| 兰溪市| 饶阳县| 新巴尔虎右旗| 福建省| 宝丰县| 纳雍县| 黔江区| 曲松县| 航空| 灌阳县| 嘉黎县| 务川| 北海市| 东源县| 海林市| 普兰县| 邵阳市| 廊坊市| 定安县| 辉南县| 山阳县| 抚顺县| 贵港市| 阿城市| 云浮市|