成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 語言中的 Defer 怎么使用?

開發(fā) 后端
在 Golang 語言中,我們可以在函數(自定義和部分內置)或方法中使用 defer 關鍵字注冊延遲調用(一個或多個),多個延遲調用的執(zhí)行順序是先進后出(FILO)。

[[404327]]

 01介紹

在 Golang 語言中,我們可以在函數(自定義和部分內置)或方法中使用 defer 關鍵字注冊延遲調用(一個或多個),多個延遲調用的執(zhí)行順序是先進后出(FILO)。并且不會受到函數執(zhí)行結束退出,顯式調用 return 和主動(或被動)觸發(fā) panic 的影響,注冊成功的所有延遲調用都會被執(zhí)行,除非 defer 注冊在 return 之后或者函數(或方法)調用 os.Exit(1)。

defer 注冊多個延遲調用,執(zhí)行順序是先進后出(FILO)。

示例代碼:

  1. func main () { 
  2.  defer func() { 
  3.   fmt.Println("A"
  4.  }() 
  5.  
  6.  defer func() { 
  7.   fmt.Println("B"
  8.  }() 
  9.  
  10.  fmt.Println("main goroutine run over"
  11.  
  12.  // panic("this is a panic example"
  13.  
  14.  // return 

defer 如果定義在 return 之后,它等于 defer 沒有注冊,將不會執(zhí)行。

示例代碼:

  1. func main () { 
  2.  fmt.Println("main"
  3.  return 
  4.  defer func() { 
  5.   fmt.Println("A"
  6.  }() 

defer 所在的函數或方法中,如果調用 os.Exit(1),defer 即便注冊,也不會執(zhí)行。

示例代碼:

  1. func main () { 
  2.  defer func() { 
  3.   fmt.Println("A"
  4.  }() 
  5.  fmt.Println("main"
  6.  os.Exit(1) 

defer 必須在函數和方法中才可以使用,并且 defer 后面必須是函數(自定義和部分內置函數)或方法,defer 函數的實參是值拷貝。

示例代碼

  1. func main () { 
  2.  a := 0 
  3.  defer func(num int) { 
  4.   fmt.Println("defer func()", num) 
  5.  }(a) 
  6.  a++ 
  7.  fmt.Println(a) 

02使用場景

使用關鍵字 defer 注冊的函數(自定義和部分內置)或方法,因為不會受到函數執(zhí)行結束,顯式調用 return 和主動(或被動)觸發(fā) panic 的影響,通常會用于防止忘記釋放資源和捕獲 panic(同一 goroutine 中) 防止應用程序崩潰退出的應用場景。

示例代碼:

  1. func main () { 
  2.  f, err := os.OpenFile("text.txt", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0755) 
  3.  if err != nil { 
  4.   fmt.Println(err) 
  5.  } 
  6.  defer f.Close() 
  7.  n, err := f.WriteString("this is a text file\t"
  8.  if err != nil { 
  9.   fmt.Println(err) 
  10.  } 
  11.  fmt.Println(n) 

閱讀上面這段代碼,我們使用 defer 延遲調用釋放資源,防止忘記釋放資源(關閉文件或解鎖),通常 defer 會放在錯誤檢查之后。

示例代碼:

  1. func main () { 
  2.  defer func() { 
  3.   if err := recover(); err != nil { 
  4.    fmt.Println("this is a panic" ) 
  5.   } 
  6.  }() 
  7.  panic("this is a test panic"
  8.  fmt.Println("main"

閱讀上面這段代碼,我們使用 defer 配合 recover 函數,用于攔截 panic(同一 goroutine 中),防止程序崩潰退出。

03注意事項

雖然使用 defer 具有可以用于防止忘記釋放資源和攔截 panic(同一 goroutine 中)防止應用程序崩潰退出等好處。

但是 defer 也有副作用,它會使資源延遲釋放,defer 盡量不要再 for-loop 中使用,并且相比于未使用 defer 調用的函數(自定義和部分內置)或方法,defer 也有一定的性能損耗,Golang 語言官方也在 golang 1.13 和 golang 1.14 中優(yōu)化了 defer 的性能。

相比于 defer 的性能損耗,defer 帶來的使代碼更加優(yōu)雅、可讀和健壯等優(yōu)勢,我認為 defer 綜合來看,利大于弊,它可以給 gopher 們帶來的收益比付出的代價更大。所以,我建議大家盡量使用 defer。

還有一點需要注意的是,我們不要使用 defer 調用有返回值的自定義函數或方法,返回值會丟失,可能會給應用程序帶來意想不到的錯誤。

04總結

本文我們介紹了 defer 的執(zhí)行機制,使用場景和注意事項,并且給出了相應的示例代碼。通常我們會在 Golang 語言開發(fā)中使用 defer 防止忘記釋放資源(關閉文件或解鎖)和捕獲 panic(同一 goroutine 中) 防止應用程序崩潰退出。

本文轉載自微信公眾號「Golang語言開發(fā)棧」,可以通過以下二維碼關注。轉載本文請聯系Golang語言開發(fā)棧公眾號。

 

責任編輯:武曉燕 來源: Golang語言開發(fā)棧
相關推薦

2013-06-25 09:52:32

GoGo語言Go編程

2021-04-28 09:02:48

Golang語言Context

2024-01-07 23:11:16

defer?Go語言

2021-09-13 05:02:49

GogRPC語言

2024-04-01 00:02:56

Go語言代碼

2021-07-12 05:05:59

Golang語言字段

2021-01-29 08:56:13

Golang標準庫函數

2021-05-07 15:28:03

Kafka客戶端Sarama

2021-06-09 23:36:46

Golang語言版本

2011-05-13 17:25:34

C

2024-05-10 08:36:40

Go語言對象

2021-10-10 23:02:49

Golang語言代碼

2021-12-13 01:24:14

語言Golang panic

2021-06-29 23:40:19

Golang語言并發(fā)

2014-04-09 09:32:24

Go并發(fā)

2011-05-25 13:22:05

PHPJSON

2022-01-04 23:13:57

語言PanicGolang

2021-11-08 23:09:07

Go排序數據

2023-10-09 07:14:42

panicGo語言

2021-07-26 11:19:43

微服務開發(fā)技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久激情网| 人人干视频在线 | 日本免费一区二区三区四区 | 欧美亚洲国语精品一区二区 | 特级做a爰片毛片免费看108 | 国产精品久久久久久久久久99 | 久久99这里只有精品 | 婷婷丁香激情 | 美女视频网站久久 | 中国一级特黄真人毛片免费观看 | 韩国av网站在线观看 | 国产99久久久国产精品下药 | 中文字幕一区二区在线观看 | 亚洲在线日韩 | 一级片网站视频 | 亚洲精品国产电影 | 欧美一区二区视频 | 国产一区91在线 | 国产黄色大片网站 | caoporn免费在线视频 | 欧美夜夜 | 成人妇女免费播放久久久 | 91在线一区| 欧美成人a∨高清免费观看 色999日韩 | 欧美日韩国产综合在线 | 一级中国毛片 | 成人在线中文 | 久久久www成人免费精品 | 欧美一级毛片久久99精品蜜桃 | 成人免费在线观看 | 欧美一区永久视频免费观看 | 一区中文字幕 | 综合精品久久久 | 亚洲成人动漫在线观看 | 国产不卡在线观看 | 99日韩 | 老熟女毛片 | 国产精品久久久久久久久久久久久 | 一区二区三区四区在线视频 | 日韩亚洲欧美一区 | 米奇7777狠狠狠狠视频 |