色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

defer的這些坑,你遇到過嗎?

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-12-01 09:28 ? 次閱讀

1:延遲函數傳遞的參數是值


func deferTest() {
  var a = 1
  defer fmt.Println(a)
  
  a = 2
  return
}

結論:延遲函數 fmt.Println(a) 的參數在 defer 語句出現的時候就已經確定下來了,所以不管后面如何修改 a 變量,都不會影響延遲函數

2:延遲函數傳遞的參數是地址


func deferTest() {
  var arr = [3]int{1, 2, 3}
  defer printTest(&arr)


  arr[0] = 4
  return
}


func printTest(array *[3]int) {
  for i := range array {
    fmt.Println(array[i])
  }
}


結論:延遲函數 printTest() 的參數在 defer 語句出現的時候就已經確定下來了,即為數組的地址,延遲函數執行的時機是在 return 語句之前,所以對數組的最終修改的值會被打印出來。

3:延遲函數可能會影響函數的返回值


fmt.Println(deferTest)


func deferTest() (result int) {
  i := 1
  defer func() {
    result = 2
  }()
  return i
}

結論:函數的 return 語句并不是原子級的,實際的執行過程為為設置返回值—>ret,defer 語句是在返回前執行,所以返回過程是:「設置返回值—>執行defer—>ret」。所以 return 語句先把 result 設置成 i 的值(1),defer 語句中又把 result設置為 2 ,所以最終返回值為 2

4:defer需要定義在panic


func panicBeforeDefer() {
  panic("a")
  defer func() {
    fmt.Println("b")
  }()
}


func panicAfterDefer() {
  defer func() {
    fmt.Println("b")
  }()
  panic("a")
}

結論:代碼執行到了painc之后再執行的defer,然后按照defer的先進后出的順序執行defer,最后才執行panic。那為什么panic時會執行defer,可以看下這段代碼就很清楚了。


func gopanic(e interface{}) {
  gp := getg() 
  ...
  
  var p _panic
  p.arg = e
  p.link = gp._panic
  gp._panic = (*_panic)(noescape(unsafe.Pointer(&p)))


  
  for {
    
    d := gp._defer
    if d == nil {
      break
    }
      ...
  }
}

5:先判斷err,再defer釋放資源


func openFile() {
  file, err := os.Open("txt")
  if err != nil {
    return
  }
  defer file.Close()
}

結論:獲取文件資源的時候會返回err,如果我們在后續需要進行defer釋放文件資源時,這里需要對err進行判斷。因為如果獲取文件資源失敗的時候不需要進行釋放,也避免了沒獲取到資源可能導致的釋放函數執行錯誤。

6:os.Exit時defer不會被執行


func deferExit() {
  defer func() {
    fmt.Println("exit")
  }()
  os.Exit(1)
}

結論:上面代碼中的defer不會得到執行,因為os.Exit()用于立即中止程序,不可能恢復或運行延遲清理語句,不像panic會去找goroutine的defer鏈表。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • defer
    +關注

    關注

    0

    文章

    2

    瀏覽量

    1126

原文標題:【Golang】defer的這些坑,你遇到過嗎?

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    請問大家有沒有遇到過這種問題?該怎么解決?

    本人最近做了ADC1的十六路轉換,與雙ADC的十六路轉換,其中測試結果發現個別通道的轉換結果要比其他的大一下,大概256左右,0.2V左右,請問大家遇到過這種問題沒有?這是什么原因導致呢?如何去解決?大家有什么好的想法和方法不防說出來大家討論學習一下,謝謝了
    發表于 06-12 03:21

    這些CAD問題遇到過嗎?CAD常見問題匯總解答!

    常規的倒圓角制圖外,還可以用于繪制平行線相切半圓,這比傳統的先畫相切圓、再剪切的制圖方法快10倍。怎么樣這些CAD入門學習過程中常見的問題是不是也遇到過?各位小伙伴在以后學習CAD制圖時如果
    發表于 03-05 15:44

    IAP功能實現過程中遇到

    IAP功能實現過程中遇到過哪些?怎樣去解決呢?
    發表于 10-25 09:11

    使用openocd下載程序時報錯有人遇到過

    clion下使用openocd燒寫程序報錯在Mac下使用clion開發STM32,在使用openocd下載程序時報錯,出現了如下提示,請問有人遇到過嗎?在網上找了好多天,都沒找到解決方案。
    發表于 01-10 08:28

    是否遇到過某個MCU串口不夠的情況

    是否遇到過某個MCU串口不夠的情況?這時我們可以考慮用GPIO去模擬,如何具體實現呢?首選我們需要了解串口的傳輸協議,UART使用異步模式工作,不需要時鐘信號,其一般格式為:起始位+數...
    發表于 02-10 06:45

    都知道RK3288編譯遇到過哪些問題嗎

    都知道RK3288編譯遇到過哪些問題嗎?
    發表于 03-04 07:22

    用J_link下載程序是遇到的問題,有哪個大佬遇到過,怎么解決的?

    用J_link下載程序是遇到的問題,有哪個大佬遇到過,怎么解決的?
    發表于 02-24 18:31

    請問各位在0使用M0外部晶振時遇到過頻率偏低的問題嗎?

    請問各位在0使用M0外部晶振時遇到過頻率偏低的問題嗎?我在最近遇到了使用36MHz晶振時有大約3.3%的片子頻率偏低,在2013年8月還遇到過一次,換了晶振和電阻電容都不管用,只有換了M0片子才管用,難道M0震蕩部分有缺陷?
    發表于 08-24 06:56

    電瓶修復—電池負極閉孔遇到過沒?

    最近啊不管是私信還是在網上很多朋友都問到負極閉孔這個詞,還問我電池負極閉孔遇到過沒?那么今天就來講一下我很久之前遇到的這方面問題。 電瓶修復 負極閉孔這是我親身經歷的事情:十年前,我到泉州一個工廠
    的頭像 發表于 03-16 10:49 ?2155次閱讀

    PCB設計遇到過孔stub如何解決

    N年的寶貴經驗告訴我們,PCB設計遇到過孔stub時,最好辦法就是器件在表層走線靠下層,器件在底層走線就靠上層,這樣能把stub降到最低。但是,有沒有一種種情況,你們覺得無論走哪一層都覺得
    的頭像 發表于 03-29 11:16 ?9409次閱讀

    使用Redis時可能遇到哪些「」?

    這篇文章,我想和你聊一聊在使用 Redis 時,可能會踩到的「」。 如果在使用 Redis 時,也遇到過以下這些「詭異」的場景,那很大概率是踩到「
    的頭像 發表于 04-09 11:19 ?2337次閱讀
    使用Redis時可能<b class='flag-5'>遇到</b>哪些「<b class='flag-5'>坑</b>」?

    這17種焊接陷阱,遇到過多少?

    良好的焊接是保證電路穩定持久工作的前提。下面給出了常見到的焊接缺陷。看看你遇到過多少種?焊接中的常見問題▲陷阱1:錫珠▲陷阱2:擾動的焊接——在焊接點冷卻過程中焊錫移動,造成焊接表面起霧、結晶、粗糙
    的頭像 發表于 04-14 09:39 ?932次閱讀
    這17種焊接陷阱,<b class='flag-5'>你</b><b class='flag-5'>遇到過</b>多少?

    這17種焊接陷阱,遇到過多少?

    良好的焊接是保證電路穩定持久工作的前提。下面給出了常見到的焊接缺陷。看看你遇到過多少種?焊接中的常見問題▲陷阱1:錫珠▲陷阱2:擾動的焊接——在焊接點冷卻過程中焊錫移動,造成焊接表面起霧、結晶、粗糙
    的頭像 發表于 04-14 09:37 ?860次閱讀
    這17種焊接陷阱,<b class='flag-5'>你</b><b class='flag-5'>遇到過</b>多少?

    【廣凌房產】高校公用房管理中的這些問題,遇到過嗎?

    高校公用房屬于國有資產的一部分,但管理過程中遇到各種困難,以下這些問題遇到過嗎?
    的頭像 發表于 05-30 11:15 ?539次閱讀
    【廣凌房產】高校公用房管理中的<b class='flag-5'>這些</b>問題,<b class='flag-5'>你</b><b class='flag-5'>遇到過</b>嗎?

    【電路設計】這17種焊接陷阱,遇到過多少?

    良好的焊接是保證電路穩定持久工作的前提。下面給出了常見到的焊接缺陷。看看你遇到過多少種?焊接中的常見問題▲陷阱1:錫珠▲陷阱2:擾動的焊接——在焊接點冷卻過程中焊錫移動,造成焊接表面起霧、結晶、粗糙
    的頭像 發表于 05-24 09:27 ?891次閱讀
    【電路設計】這17種焊接陷阱,<b class='flag-5'>你</b><b class='flag-5'>遇到過</b>多少?
    主站蜘蛛池模板: 你是淫荡的我的女王 | 青青草偷拍国产亚洲欧洲 | 免费国产成人高清在线观看视频 | 日韩一区二区三区精品 | 啦啦啦 中文 日本 韩国 免费 | 久久中文字幕免费视频 | 无码欧美喷潮福利XXXX | 父亲在线日本综艺免费观看全集 | 最近日本MV字幕免费观看在线 | 白洁在线观看 | 国产精品成人不卡在线观看 | 国产成人v视频在线观看 | 精品无码三级在线观看视频 | 国产色婷婷精品人妻蜜桃成熟 | 日本欧美久久久久免费播放网 | 好姑娘BD高清在线观看免费 | 亚洲一区高清 | 日本十八禁无遮拦啪啪漫画 | 怡春院欧美一区二区三区免费 | 人禽l交视频在线播放 视频 | 办公室丝袜老师在线观看 | 中文中幕无码亚洲在线 | 97精品在线播放 | 播色屋97超碰在人人 | 久久久91精品国产一区二区 | 久久精品一卡二卡三卡四卡视频版 | 亚洲AV一宅男色影视 | 日日AV夜夜添久久奶无码 | 蜜桃传媒在线观看 | 亚洲精品国产SUV | 美女被免费喷白浆视频 | 制服国产欧美亚洲日韩 | jk制服啪啪网站 | 毛茸茸womansex | 伊人久综合| 国产精品高清在线观看93 | 免费看到湿的小黄文软件APP | 国产精品自在自线亚洲 | 少妇精品无码一区二区三区 | 灌饱娇嫩H将军公主最新章节 | 国产精品97久久久久久AV色戒 |