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

Golang 語言怎么避免引發 Panic?

開發 后端
本文我們介紹 Golang 語言中容易引發 panic 的場景,尤其是空指針操作是最容易踩坑的場景,我們在程序開發中,一定要小心使用指針類型。

[[439971]]

01介紹

在 Golang 語言中,程序引發 panic 會導致程序崩潰,所以我們在程序開發時,需要特別小心,避免引發 panic。本文我們介紹 Golang 語言中比較容易引發 panic 的操作。

02指針

任意一種編程語言都會使用函數,我們使用 Golang 編寫函數或方法時,經常會用到指針類型的返回值,這時如果執行調用空指針(指針未初始化或值為 nil),對于新手而言,就很容易引發程序 panic。

  1. type User struct { 
  2.  Name string 
  3.  Age  int 
  4.  
  5. func (u *User) GetInfo() (data *User) { 
  6.  data = &User
  7.   Name"frank"
  8.   Age:  18, 
  9.  } 
  10.  return data 
  11.  
  12. func main() { 
  13.  user := new(User
  14.  userInfo := user.GetInfo() 
  15.  fmt.Println(userInfo) 
  16.  if userInfo.Age >= 18 { 
  17.   fmt.Println("this is a man"
  18.  } 

我們閱讀上面這段代碼,這是一段非常簡單的返回值為指針類型的示例代碼,讀者朋友們試想一下。

如果 GetInfo 方法體中的 data 的值來源于調用另外一個函數或方法,被調用的這個函數或方法返回值是 nil,而我們 main 函數中會使用返回值的 Age 字段作為判定條件,這時程序就會引發 panic,導致程序崩潰。

所以,我們在使用指針類型時,要特別小心,不然我們就只能在調用函數或方法之前,使用 defer 和 recover 添加一段補償代碼,我個人感覺不是很優雅。

  1. defer func() { 
  2.   if err := recover(); err != nil { 
  3.    fmt.Println("err = ", err) 
  4.   } 
  5.  }() 

我一般是在判定指針類型的返回值時,為了避免程序引發 panic,我會加一個且(&&)的判定條件,判定返回值不是 nil,并且返回值的某個字段符合某種條件。

  1. func main() { 
  2.  ... 
  3.    
  4.  if userInfo != nil && userInfo.Age >= 18 { 
  5.   fmt.Println("this is a man"
  6.  } 

03數組和切片

數組和切片類型,當我們越界訪問時,也會引發 panic,導致程序崩潰。不過,一般 IDE 可以提示數組越界訪問的錯誤,如果讀者朋友使用的編輯器不會提示數組越界的錯誤,那你使用數組也要小心了。

  1. func main() { 
  2.  code := []string{"php""golang"
  3.  fmt.Printf("len:%d cap:%d val:%s \n", len(code), cap(code), code) 
  4.  fmt.Println(code[2]) 

04通道

如果我們關閉未初始化的通道,重復關閉通道,向已經關閉的通道中發送數據,這三種情況也會引發 panic,導致程序崩潰。

  1. func main() { 
  2.  var ch chan int 
  3.  // close(ch) 
  4.  ch = make(chan int, 1) 
  5.  ch <- 1 
  6.  // close(ch) 
  7.  // close(ch) 
  8.  ch <- 2 

05映射

如果我們直接操作未初始化的映射(map),也會引發 panic,導致程序崩潰。

  1. func main() { 
  2.  var m map[string]int 
  3.  // m = make(map[string]int
  4.  m["php"] = 80 

另外,操作映射可能會遇到的更為嚴重的一個問題是,同時對同一個映射并發讀寫,它會觸發 runtime.throw,不像 panic 可以使用 recover 捕獲。所以,我們在對同一個映射并發讀寫時,一定要使用鎖。

  1. func main() { 
  2.  var m map[string]int 
  3.  m = make(map[string]int
  4.  go func(map[string]int) { 
  5.   for { 
  6.    m["php"] = 80 
  7.   } 
  8.  }(m) 
  9.  
  10.  go func(map[string]int) { 
  11.   for { 
  12.    _ = m["php"
  13.   } 
  14.  }(m) 
  15.  
  16.  time.Sleep(time.Second

輸出結果:

  1. fatal error: concurrent map read and map write 
  2.  
  3. goroutine 7 [running]: 
  4. runtime.throw({0x10a7510, 0x0}) 
  5.         /usr/local/opt/go/libexec/src/runtime/panic.go:1198 +0x71 fp=0xc000050f28 sp=0xc000050ef8 pc=0x102fa51 

06類型斷言

如果類型斷言使用不當,比如我們不接收布爾值的話,類型斷言失敗也會引發 panic,導致程序崩潰。

  1. func main() { 
  2.  var name interface{} = "frank" 
  3.  // a, ok := name.(int
  4.  // fmt.Println(a, ok) 
  5.  a := name.(int
  6.  fmt.Println(a) 

07總結

 

本文我們介紹 Golang 語言中容易引發 panic 的場景,尤其是空指針操作是最容易踩坑的場景,我們在程序開發中,一定要小心使用指針類型。

 

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

2022-01-04 23:13:57

語言PanicGolang

2021-09-13 05:02:49

GogRPC語言

2021-06-09 23:36:46

Golang語言版本

2021-10-10 23:02:49

Golang語言代碼

2021-06-29 23:40:19

Golang語言并發

2025-03-12 12:03:10

2021-11-08 23:09:07

Go排序數據

2021-06-07 23:19:44

Golang語言 Defer

2023-10-09 07:14:42

panicGo語言

2013-03-22 09:34:13

2021-10-31 23:01:50

語言拼接字符串

2018-10-14 15:52:46

MySQL數據清理數據庫

2021-07-12 05:05:59

Golang語言字段

2021-01-29 08:56:13

Golang標準庫函數

2025-03-31 00:29:44

2020-12-22 10:29:43

漏洞SAML認證補丁

2023-05-06 09:36:38

RecoverPanic

2022-01-09 23:04:19

語言打印結構體

2014-10-31 10:04:57

程序員代碼

2018-08-01 15:10:02

GolangPython語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本成人福利 | 久久精品久久久久久 | 国产一区二区在线免费观看 | 精品九九九 | 中文字幕高清一区 | 久久久久久精 | 影音av | 一区二区视频 | 久久精品国产一区二区电影 | 色婷婷亚洲一区二区三区 | 色综合久久天天综合网 | 一区二区三区四区国产 | 97超碰在线免费 | 99re在线视频 | www.久久 | 日韩成人在线观看 | 国产我和子的乱视频网站 | 亚洲视频免费一区 | 免费人成激情视频在线观看冫 | 久久久精品网站 | 色综合色综合 | 成人国产精品久久 | 国产乱码精品一区二区三区中文 | 欧美日韩国产一区二区 | 欧美亚洲国产一区二区三区 | 久久日本 | 国产一区二区精品在线 | 国产成人免费视频网站高清观看视频 | av国产精品 | 最新av在线网址 | 亚洲成人免费网址 | 久久国产精品视频 | 日韩一区在线播放 | 国产一区二区在线视频 | 毛片视频观看 | 麻豆成人在线视频 | 精品无码久久久久久国产 | 精品国产乱码久久久久久图片 | 婷婷狠狠| 中文字幕中文字幕 | 99在线免费视频 |