一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

defer的這些坑,你遇到過(guò)嗎?

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2023-12-01 09:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1:延遲函數(shù)傳遞的參數(shù)是值


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

結(jié)論:延遲函數(shù) fmt.Println(a) 的參數(shù)在 defer 語(yǔ)句出現(xiàn)的時(shí)候就已經(jīng)確定下來(lái)了,所以不管后面如何修改 a 變量,都不會(huì)影響延遲函數(shù)

2:延遲函數(shù)傳遞的參數(shù)是地址


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])
  }
}


結(jié)論:延遲函數(shù) printTest() 的參數(shù)在 defer 語(yǔ)句出現(xiàn)的時(shí)候就已經(jīng)確定下來(lái)了,即為數(shù)組的地址,延遲函數(shù)執(zhí)行的時(shí)機(jī)是在 return 語(yǔ)句之前,所以對(duì)數(shù)組的最終修改的值會(huì)被打印出來(lái)。

3:延遲函數(shù)可能會(huì)影響函數(shù)的返回值


fmt.Println(deferTest)


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

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

4:defer需要定義在panic前


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


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

結(jié)論:代碼執(zhí)行到了painc之后再執(zhí)行的defer,然后按照defer的先進(jìn)后出的順序執(zhí)行defer,最后才執(zhí)行panic。那為什么panic時(shí)會(huì)執(zhí)行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()
}

結(jié)論:獲取文件資源的時(shí)候會(huì)返回err,如果我們?cè)诤罄m(xù)需要進(jìn)行defer釋放文件資源時(shí),這里需要對(duì)err進(jìn)行判斷。因?yàn)槿绻@取文件資源失敗的時(shí)候不需要進(jìn)行釋放,也避免了沒(méi)獲取到資源可能導(dǎo)致的釋放函數(shù)執(zhí)行錯(cuò)誤。

6:os.Exit時(shí)defer不會(huì)被執(zhí)行


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

結(jié)論:上面代碼中的defer不會(huì)得到執(zhí)行,因?yàn)閛s.Exit()用于立即中止程序,不可能恢復(fù)或運(yùn)行延遲清理語(yǔ)句,不像panic會(huì)去找goroutine的defer鏈表。







審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • defer
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    1170

原文標(biāo)題:【Golang】defer的這些坑,你遇到過(guò)嗎?

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    在使用WI-FI6模塊PTR7002時(shí)遇到過(guò)哪些通信問(wèn)題?歡迎分享解決方案!

    在使用WI-FI6模塊PTR7002時(shí)遇到過(guò)哪些通信問(wèn)題?歡迎分享解決方案!
    發(fā)表于 05-09 14:25

    這些CAD問(wèn)題遇到過(guò)嗎?CAD常見(jiàn)問(wèn)題匯總解答!

    常規(guī)的倒圓角制圖外,還可以用于繪制平行線相切半圓,這比傳統(tǒng)的先畫(huà)相切圓、再剪切的制圖方法快10倍。怎么樣這些CAD入門(mén)學(xué)習(xí)過(guò)程中常見(jiàn)的問(wèn)題是不是也遇到過(guò)?各位小伙伴在以后學(xué)習(xí)CAD制圖時(shí)如果
    發(fā)表于 03-05 15:44

    IAP功能實(shí)現(xiàn)過(guò)程中遇到

    IAP功能實(shí)現(xiàn)過(guò)程中遇到過(guò)哪些?怎樣去解決呢?
    發(fā)表于 10-25 09:11

    使用openocd下載程序時(shí)報(bào)錯(cuò)有人遇到過(guò)

    clion下使用openocd燒寫(xiě)程序報(bào)錯(cuò)在Mac下使用clion開(kāi)發(fā)STM32,在使用openocd下載程序時(shí)報(bào)錯(cuò),出現(xiàn)了如下提示,請(qǐng)問(wèn)有人遇到過(guò)嗎?在網(wǎng)上找了好多天,都沒(méi)找到解決方案。
    發(fā)表于 01-10 08:28

    是否遇到過(guò)某個(gè)MCU串口不夠的情況

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

    都知道RK3288編譯遇到過(guò)哪些問(wèn)題嗎

    都知道RK3288編譯遇到過(guò)哪些問(wèn)題嗎?
    發(fā)表于 03-04 07:22

    用J_link下載程序是遇到的問(wèn)題,有哪個(gè)大佬遇到過(guò),怎么解決的?

    用J_link下載程序是遇到的問(wèn)題,有哪個(gè)大佬遇到過(guò),怎么解決的?
    發(fā)表于 02-24 18:31

    電瓶修復(fù)—電池負(fù)極閉孔遇到過(guò)沒(méi)?

    最近啊不管是私信還是在網(wǎng)上很多朋友都問(wèn)到負(fù)極閉孔這個(gè)詞,還問(wèn)我電池負(fù)極閉孔遇到過(guò)沒(méi)?那么今天就來(lái)講一下我很久之前遇到的這方面問(wèn)題。 電瓶修復(fù) 負(fù)極閉孔這是我親身經(jīng)歷的事情:十年前,我到泉州一個(gè)工廠
    的頭像 發(fā)表于 03-16 10:49 ?2336次閱讀

    PCB設(shè)計(jì)遇到過(guò)孔stub如何解決

    N年的寶貴經(jīng)驗(yàn)告訴我們,PCB設(shè)計(jì)遇到過(guò)孔stub時(shí),最好辦法就是器件在表層走線靠下層,器件在底層走線就靠上層,這樣能把stub降到最低。但是,有沒(méi)有一種種情況,你們覺(jué)得無(wú)論走哪一層都覺(jué)得
    的頭像 發(fā)表于 03-29 11:16 ?1w次閱讀

    使用Redis時(shí)可能遇到哪些「」?

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

    這17種焊接陷阱,遇到過(guò)多少?

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

    這17種焊接陷阱,遇到過(guò)多少?

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

    【廣凌房產(chǎn)】高校公用房管理中的這些問(wèn)題,遇到過(guò)嗎?

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

    【電路設(shè)計(jì)】這17種焊接陷阱,遇到過(guò)多少?

    良好的焊接是保證電路穩(wěn)定持久工作的前提。下面給出了常見(jiàn)到的焊接缺陷。看看你遇到過(guò)多少種?焊接中的常見(jiàn)問(wèn)題▲陷阱1:錫珠▲陷阱2:擾動(dòng)的焊接——在焊接點(diǎn)冷卻過(guò)程中焊錫移動(dòng),造成焊接表面起霧、結(jié)晶、粗糙
    的頭像 發(fā)表于 05-24 09:27 ?1135次閱讀
    【電路設(shè)計(jì)】這17種焊接陷阱,<b class='flag-5'>你</b><b class='flag-5'>遇到過(guò)</b>多少?

    Modbus TCP通信的那些!遇到過(guò)幾個(gè)?

    凌晨三點(diǎn),產(chǎn)線驟停!觸摸屏瘋狂報(bào)通訊超時(shí),老板奪命連環(huán)Call轟炸,而你盯著PLC的Error燈狂閃、儀表數(shù)據(jù)集體躺平——Modbus TCP的,誰(shuí)踩誰(shuí)懂! 別慌!這篇Modbus TCP常見(jiàn)問(wèn)題
    的頭像 發(fā)表于 04-16 17:17 ?543次閱讀
    Modbus TCP通信的那些<b class='flag-5'>坑</b>!<b class='flag-5'>你</b><b class='flag-5'>遇到過(guò)</b>幾個(gè)?