主頁 > 知識庫 > 聊聊golang的defer的使用

聊聊golang的defer的使用

熱門標簽:AI電銷 百度競價排名 地方門戶網站 鐵路電話系統(tǒng) Linux服務器 服務外包 呼叫中心市場需求 網站排名優(yōu)化


本文主要研究一下golang的defer

defer

  • return先賦值(對于命名返回值),然后執(zhí)行defer,最后函數返回
  • defer函數調用的執(zhí)行順序與它們分別所屬的defer語句的執(zhí)行順序相反
  • defer后面的表達式可以是func或者是method的調用,如果defer的函數為nil,則會panic

實例

實例1

// f returns 42
func f() (result int) {
  defer func() {
    // result is accessed after it was set to 6 by the return statement
    result *= 7
  }()
  return 6
}

這里return先給result賦值為6,之后執(zhí)行defer,result變?yōu)?2,最后返回42

實例2

func f() int {
  result := 6
  defer func() {
    // result is accessed after it was set to 6 by the return statement
    result *= 7
  }()
  return result
}

這里return確定返回值6,之后defer修改result,最后函數返回return確定的返回值

實例3

func multiDefer() {
  for i := 3; i > 0; i-- {
    defer func(n int) {
      fmt.Print(n, " ")
    }(i)
  }

  for i := 3; i > 0; i-- {
    defer fmt.Print(i, " ")
  }
}

多個defer函數,按順序逆序執(zhí)行,這里輸出1 2 3

實例4

var fc func() string

func main() {
  fmt.Println("hello")
  defer fc()
}

由于defer指定的func為nil,這里panic

實例5

func main() {
  for i := 3; i > 0; i-- {
    defer func() {
      fmt.Print(i, " ")
    }()
  }
}

由于defer這里調用的func沒有參數,等執(zhí)行的時候,i已經為0,因而這里輸出3個0

小結

defer可以拆解為return賦值,defer執(zhí)行,最后代碼返回三步;defer的順序按逆序執(zhí)行。

doc

Defer_statements
Golang之Defer
golang中defer執(zhí)行時機與常見問題

到此這篇關于聊聊golang的defer的使用的文章就介紹到這了,更多相關golang defer內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang之defer 延遲調用操作
  • Golang學習筆記之延遲函數(defer)的使用小結
  • golang中defer的關鍵特性示例詳解
  • golang中defer的使用規(guī)則詳解
  • Golang巧用defer進行錯誤處理的方法
  • Golang 的defer執(zhí)行規(guī)則說明

標簽:黃山 仙桃 蘭州 湖南 衡水 銅川 崇左 湘潭

巨人網絡通訊聲明:本文標題《聊聊golang的defer的使用》,本文關鍵詞  ;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266