成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何理解Go錯誤處理之用panic取代rr!=nil的模式

這篇文章主要介紹“如何理解Go錯誤處理之用panic取代rr != nil的模式”,在日常操作中,相信很多人在如何理解Go錯誤處理之用panic取代rr != nil的模式問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解Go錯誤處理之用panic取代rr != nil的模式”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)公司是一家以網(wǎng)站建設、網(wǎng)頁設計、品牌設計、軟件運維、成都網(wǎng)站營銷、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計為集裝箱等眾行業(yè)中小客戶提供優(yōu)質的互聯(lián)網(wǎng)建站和軟件開發(fā)服務。

為什么想替換

在 Go 語言中 if err != nil 寫的太多,還要管方法聲明各種,嫌麻煩又不方便:

err := foo() if err != nil {      //do something..      return err }  err := foo() if err != nil {      //do something..      return err }  err := foo() if err != nil {      //do something..      return err }  err := foo() if err != nil {      //do something..      return err }

上述還是示例代碼,比較直面。若是在工程實踐,還得各種 package 跳來跳去加 if err != nil,講更繁瑣,要去關心整體的上下游。

其余更具體的就不贅述了,可以關注我的公眾號翻看先前的文章。

怎么替換 err != nil

不想寫 if err != nil 的代碼,方式之一就是用 panic 來替代他。

示例代碼如下:

func GetFish(db *sql.DB, name string) []string {  rows, err := db.Query("select name from users where `name` = ?", name)  if err != nil {   panic(err)  }  defer rows.Close()   var names []string  for rows.Next() {   var name string   err := rows.Scan(&name)   if err != nil {    panic(err)   }    names = append(names, name)  }   err = rows.Err()  if err != nil {   panic(err)  }   return names }

在上述業(yè)務代碼中,我們通過 panic 的方式取代了 return err 的函數(shù)返回,自然其所關聯(lián)的下游業(yè)務代碼也就不需要編寫 if err !=  nil 的代碼:

func main() {  fish2 := GetFish(db, "煎魚")  fish3 := GetFish(db, "咸魚")  fish4 := GetFish(db, "摸魚")  ... }

同時在轉換為使用 panic 模式的錯誤機制后,我們必須要在外層增加 recover 方法:

func AppRecovery() gin.HandlerFunc {  return func(c *gin.Context) {   defer func() {    if err := recover(); err != nil {     if _, ok := err.(AppErr); ok {      // do something...     } else {      panic(err)     }    }   }()  } }

每次 panic 后根據(jù)其拋出的錯誤進行斷言,識別是否定制的 AppErr 錯誤類型,若是則可以進行一系列的處理動作。

否則可繼續(xù)向上 panic 拋出給頂級的 Recovery 方法進行處理。

這就是一個相對完整的 panic 錯誤鏈路處理了。

優(yōu)缺點

  • 從優(yōu)點上來講:

    • 整體代碼結構看起來更加的簡潔,僅專注于實現(xiàn)邏輯即可。

    • 不需要關注和編寫冗雜的 if err != nil 的錯誤處理代碼。

  • 從缺點上來講:

    • 認知負擔的增加,需要參加項目的每一個新老同學都清楚該模式,要做一個基本規(guī)范或培訓。

    • 存在一定的性能開銷,每次 panic 都存在用戶態(tài)的上下文切換。

    • 存在一定的風險性,一旦 panic 沒有 recover 住,就會導致事故。

    • Go 官方并不推薦,與 panic 本身的定義相違背,也就是 panic 與 error 的概念混淆。

到此,關于“如何理解Go錯誤處理之用panic取代rr != nil的模式”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)頁名稱:如何理解Go錯誤處理之用panic取代rr!=nil的模式
本文網(wǎng)址:http://jinyejixie.com/article48/gpgchp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航品牌網(wǎng)站設計、移動網(wǎng)站建設、小程序開發(fā)、云服務器、標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網(wǎng)站制作
惠州市| 安新县| 建始县| 宣威市| 石城县| 遵义县| 云南省| 阿图什市| 慈溪市| 江口县| 长宁县| 渭南市| 玛曲县| 贡觉县| 西畴县| 炉霍县| 兰州市| 北宁市| 平阴县| 郁南县| 苏尼特左旗| 肃北| 马尔康县| 天长市| 晋中市| 乐陵市| 阿图什市| 峡江县| 高雄县| 平度市| 儋州市| 土默特左旗| 临海市| 台南县| 高阳县| 黄冈市| 永平县| 邢台县| 巴彦淖尔市| 红原县| 衡南县|