精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Go Error 嵌套到底是怎么實現的?

開發 后端
Go Error 的設計哲學是 「Errors Are Values」。這句話應該怎么理解呢?翻譯起來挺難的。不過從源碼的角度來看,好像更容易理解其背后的含義。

Go Error 的設計哲學是 「Errors Are Values」。

這句話應該怎么理解呢?翻譯起來挺難的。不過從源碼的角度來看,好像更容易理解其背后的含義。

Go Error 源碼很簡單,寥寥幾行:

  1. // src/builtin/builtin.go 
  2.  
  3. type error interface { 
  4.  Error() string 

error 是一個接口類型,只需要實現 Error() 方法即可。在 Error() 方法中,就可以返回自定義結構體的任意內容。

下面首先說說如何創建 error。

創建 Error

創建 error 有兩種方式,分別是:

  • errors.New();
  • fmt.Errorf()。

errors.New()

errors.New() 的使用延續了 Go 的一貫風格,New 一下就可以了。

舉一個例子:

  1. package main 
  2.  
  3. import ( 
  4.  "errors" 
  5.  "fmt" 
  6.  
  7. func main() { 
  8.  err := errors.New("這是 errors.New() 創建的錯誤"
  9.  fmt.Printf("err 錯誤類型:%T,錯誤為:%v\n", err, err) 
  10.  
  11. /* 輸出 
  12. err 錯誤類型:*errors.errorString,錯誤為:這是 errors.New() 創建的錯誤 
  13. */ 

這段代碼唯一讓人困惑的地方可能就是錯誤類型了,但沒關系。只要看一下源碼,就瞬間迎刃而解。

源碼如下:

  1. // src/errors/errors.go 
  2.  
  3. // New returns an error that formats as the given text. 
  4. // Each call to New returns a distinct error value even if the text is identical. 
  5. func New(text string) error { 
  6.  return &errorString{text} 
  7.  
  8. // errorString is a trivial implementation of error. 
  9. type errorString struct { 
  10.  s string 
  11.  
  12. func (e *errorString) Error() string { 
  13.  return e.s 

可以看到,errorString 是一個結構體,實現了 Error() 方法,New 函數直接返回 errorString 指針。

這種用法很簡單,但不實用。假如我還想返回程序的上下文信息,它就沒轍了。

下面看第二種方式。

fmt.Errorf()

還是先看一個例子:

  1. package main 
  2.  
  3. import ( 
  4.  "database/sql" 
  5.  "fmt" 
  6.  
  7. func foo() error { 
  8.  return sql.ErrNoRows 
  9.  
  10. func bar() error { 
  11.  return foo() 
  12.  
  13. func main() { 
  14.  err := bar() 
  15.  if err == sql.ErrNoRows { 
  16.   fmt.Printf("data not found, %+v\n", err) 
  17.   return 
  18.  } 
  19.  if err != nil { 
  20.   fmt.Println("Unknown error"
  21.  } 
  22.  
  23. /* 輸出 
  24. data not found, sql: no rows in result set 
  25. */ 

這個例子輸出了我們想要的結果,但是還不夠。

一般情況下,我們會通過使用 fmt.Errorf() 函數,附加上我們想添加的文本信息,使返回內容更明確,處理起來更靈活。

所以,foo() 函數會改成下面這樣:

  1. func foo() error { 
  2.    return fmt.Errorf("foo err, %v", sql.ErrNoRows) 

這時問題就出現了,經過 fmt.Errorf() 的封裝,原始 error 類型發生了改變,這就導致 err == sql.ErrNoRows 不再成立,返回信息變成了 Unknown error。

如果想根據返回的 error 類型做不同處理,就無法實現了。

因此,Go 1.13 為我們提供了 wrapError 來處理這個問題。

Wrap Error

看一個例子:

  1. package main 
  2.  
  3. import ( 
  4.  "fmt" 
  5.  
  6. type myError struct{} 
  7.  
  8. func (e myError) Error() string { 
  9.  return "Error happended" 
  10.  
  11. func main() { 
  12.  e1 := myError{} 
  13.  e2 := fmt.Errorf("E2: %w", e1) 
  14.  e3 := fmt.Errorf("E3: %w", e2) 
  15.  fmt.Println(e2) 
  16.  fmt.Println(e3) 
  17.  
  18. /* output 
  19. E2: Error happended 
  20. E3: E2: Error happended 
  21. */ 

乍一看好像好沒什么區別,但背后的實現原理卻并不相同。

Go 擴展了 fmt.Errorf() 函數,增加了一個 %w 標識符來創建 wrapError。

  1. // src/fmt/errors.go 
  2.  
  3. func Errorf(format string, a ...interface{}) error { 
  4.  p := newPrinter() 
  5.  p.wrapErrs = true 
  6.  p.doPrintf(format, a) 
  7.  s := string(p.buf) 
  8.  var err error 
  9.  if p.wrappedErr == nil { 
  10.   err = errors.New(s) 
  11.  } else { 
  12.   err = &wrapError{s, p.wrappedErr} 
  13.  } 
  14.  p.free() 
  15.  return err 

當使用 w% 時,函數會返回 &wrapError{s, p.wrappedErr},wrapError 結構體定義如下:

  1. // src/fmt/errors.go 
  2.  
  3. type wrapError struct { 
  4.  msg string 
  5.  err error 
  6.  
  7. func (e *wrapError) Error() string { 
  8.  return e.msg 
  9.  
  10. func (e *wrapError) Unwrap() error { 
  11.  return e.err 

實現了 Error() 方法,說明它是一個 error,而 Unwrap() 方法是為了獲取被封裝的 error。

  1. // src/errors/wrap.go 
  2.  
  3. func Unwrap(err error) error { 
  4.  u, ok := err.(interface { 
  5.   Unwrap() error 
  6.  }) 
  7.  if !ok { 
  8.   return nil 
  9.  } 
  10.  return u.Unwrap() 

它們之間的關系是這樣的:

 

Go Error 嵌套到底是怎么實現的?

 

因此,我們可以使用 w% 將上文中的程序進行改造,使其內容輸出更豐富。

如下:

  1. package main 
  2.  
  3. import ( 
  4.  "database/sql" 
  5.  "errors" 
  6.  "fmt" 
  7.  
  8. func bar() error { 
  9.  if err := foo(); err != nil { 
  10.   return fmt.Errorf("bar failed: %w", foo()) 
  11.  } 
  12.  return nil 
  13.  
  14. func foo() error { 
  15.  return fmt.Errorf("foo failed: %w", sql.ErrNoRows) 
  16.  
  17. func main() { 
  18.  err := bar() 
  19.  if errors.Is(err, sql.ErrNoRows) { 
  20.   fmt.Printf("data not found,  %+v\n", err) 
  21.   return 
  22.  } 
  23.  if err != nil { 
  24.   fmt.Println("Unknown error"
  25.  } 
  26.  
  27. /* output 
  28. data not found,  bar failed: foo failed: sql: no rows in result set 
  29. */ 

終于有了讓人滿意的輸出結果,每個函數都增加了必要的上下文信息,而且也符合對錯誤類型的判斷。

errors.Is() 函數用來判斷 err 以及其封裝的 error 鏈中是否包含目標類型。這也就解決了上文提出的無法判斷錯誤類型的問題。

后記

其實,Go 目前對 Error 的處理方式也是充滿爭議的。不過,官方團隊正在積極和社區交流,提出改進方法。相信在不久的將來,一定會找到更好的解決方案。

現階段來說,大部分團隊可能會選擇 github.com/pkg/errors 包來進行錯誤處理。如果感興趣的話,可以學學看。

好了,本文就到這里吧。關注我,帶你通過問題讀 Go 源碼。

源碼地址:https://github.com/yongxinz/gopher

參考文章:

https://chasecs.github.io/posts/the-philosophy-of-go-error-handling/

https://medium.com/@dche423/golang-error-handling-best-practice-cn-42982bd72672

 

https://www.flysnow.org/2019/09/06/go1.13-error-wrapping.html

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-01-07 07:59:14

Go語言Go Error

2016-11-17 22:18:31

id串行化服務器

2024-03-15 08:06:58

MySQLJOIN命令

2020-12-28 08:18:55

安全代碼線程

2024-05-11 09:41:45

線程安全代碼

2019-05-28 13:50:27

MySQL幻讀數據庫

2019-12-18 18:31:10

黑客醫療保險軟件

2023-07-14 12:21:29

流程@Autowired方法

2024-02-22 08:00:00

SoraOpenAI

2022-08-08 08:00:00

人工智能機器學習計算機應用

2023-10-12 08:54:20

Spring事務設置

2018-02-24 23:19:31

iOSbug蘋果

2024-12-09 09:55:25

2022-04-15 08:54:39

PythonAsync代碼

2022-05-24 17:00:41

區塊鏈IT比特幣

2025-10-29 07:33:13

2018-09-30 15:05:01

Linux用戶組命令

2015-04-21 09:20:40

SwfitObject—C

2025-10-31 00:00:02

硅光光通信英偉達

2022-04-10 19:26:07

TypeScript類型語法
點贊
收藏

51CTO技術棧公眾號

aaa一区二区| 国内毛片毛片毛片毛片毛片| 忘忧草在线日韩www影院| 26uuu精品一区二区三区四区在线| 国产成人av网址| 小向美奈子av| 日韩激情网站| 欧美精三区欧美精三区| av无码久久久久久不卡网站| 国产午夜精品一区理论片| 国产最新精品免费| 欧美亚洲在线观看| avove在线播放| 欧美精品一区二区三区精品| 日韩欧美国产精品| 九九视频精品在线观看| 国产在线拍揄自揄拍视频| 久久久国产精品午夜一区ai换脸 | 日韩制服一区| 依依成人精品视频| 亚洲五月六月| 你懂的免费在线观看| 国产精品538一区二区在线| 日韩美女视频免费在线观看| 国产一级视频在线播放| 99精品综合| 亚洲一区www| 亚洲一区二区三区四区五区六区| 国产亚洲观看| 欧美性猛片xxxx免费看久爱| 97成人在线免费视频| jizzjizz亚洲| 国产精品久久久久一区二区三区| 久久久av水蜜桃| 性猛交富婆╳xxx乱大交天津 | 亚洲成人精品| 最近2019中文字幕mv免费看| 五级黄高潮片90分钟视频| 亚洲一区 二区| 日韩一区二区三区电影| 亚洲欧美aaa| 久久亚洲精品人成综合网| 日本大香伊一区二区三区| 日韩欧美国产免费| 成av人片在线观看www| 亚洲综合丝袜美腿| 久久福利一区二区| 91一区二区三区在线| 亚洲欧洲精品一区二区三区不卡| 日韩影院一区| 97超碰人人在线| 国产欧美中文在线| 日本视频一区二区在线观看| 撸视在线观看免费视频| 久久久.com| 五月婷婷综合色| 在线免费黄色| 亚洲欧美日韩在线不卡| 无码毛片aaa在线| 日本片在线观看| 亚洲国产日韩a在线播放性色| 日韩久久久久久久久久久久| 污视频在线看网站| 亚洲成人自拍偷拍| 国产精品亚洲αv天堂无码| 浪潮色综合久久天堂| 色域天天综合网| 视频二区在线播放| 国产一区二区三区免费观看在线| 日韩免费观看高清完整版在线观看| 韩国三级丰满少妇高潮| 777久久精品| 精品无人区太爽高潮在线播放| 国产亚洲无码精品| jvid福利在线一区二区| 久久久精品电影| 精品无码人妻一区二区三区品| 99精品视频网| 国产精品男人的天堂| 国产精品无码AV| av电影一区二区| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 91久久精品美女高潮| 高潮毛片7777777毛片| 91视频.com| 一区二区三区不卡在线| 国产嫩草在线视频| 91国偷自产一区二区开放时间| 亚洲综合日韩欧美| 国产一区二区三区亚洲| 亚洲天堂男人天堂| 中文字幕手机在线观看| 美女久久网站| 成人午夜一级二级三级| 天天干天天做天天操| 日本一区二区三区四区在线视频| 六月婷婷激情网| 手机在线观看av网站| 欧美剧情电影在线观看完整版免费励志电影 | 国产av无码专区亚洲av毛网站| 99精品国产在热久久婷婷| 91精品久久久久久久久中文字幕| 五月天婷婷在线观看| 中文字幕日本乱码精品影院| 免费毛片网站在线观看| 99久久婷婷国产综合精品首页| 精品国产一区二区三区久久久蜜月| 91久久免费视频| 亚洲性图久久| 成人深夜直播免费观看| 国产无套粉嫩白浆在线2022年 | 亚洲国产av一区二区三区| 国产精品伊人色| 色一情一乱一伦一区二区三欧美 | 亚洲自拍另类综合| 午夜一区二区视频| 欧美色图激情小说| 97在线精品视频| 国产成人a人亚洲精品无码| 国产视频在线观看一区二区三区 | 精品亚洲乱码一区二区| 久久福利影视| 精品国产乱码久久久久久108| 黄视频在线观看网站| 欧美中文字幕一二三区视频| 人体私拍套图hdxxxx| 综合激情视频| 成人午夜在线视频一区| gogogo高清在线观看免费完整版| 五月激情六月综合| 曰本三级日本三级日本三级| 婷婷久久一区| 成人欧美一区二区三区黑人孕妇 | 久久国产这里只有精品| 国产精品三级| 欧美一级片一区| 神马久久久久久久久久| 亚洲大片一区二区三区| 免费不卡的av| 激情亚洲网站| 国产精品亚洲不卡a| 欧美日韩经典丝袜| 日韩丝袜情趣美女图片| 激情综合网五月天| 国产盗摄精品一区二区三区在线 | 草莓福利社区在线| 欧美丰满少妇xxxbbb| 日韩欧美在线视频播放| 蜜桃精品视频在线| 亚洲欧洲日韩综合二区| 国产福利亚洲| 精品久久久av| 精品二区在线观看| 亚洲一区二区精品视频| 日本久久久久久久久久| 国产精品玖玖玖在线资源| 伊色综合久久之综合久久| 国产电影一区二区三区爱妃记| 亚洲人免费短视频| 日韩 欧美一区二区三区| 国产精品免费看一区二区三区| 直接在线观看的三级网址| 91精品国产综合久久精品app| 亚洲人做受高潮| 麻豆一区二区99久久久久| 亚洲一区二区三区午夜| 九九九在线视频| 亚洲黄色视屏| 区一区二区三区中文字幕| 亚洲免费av网| 尤物视频在线看| 欧美mv和日韩mv国产网站| 日韩成人高清视频| 国产午夜亚洲精品理论片色戒 | 亚洲国产精品精华素| 亚洲第一页自拍| 麻豆精品久久久久久久99蜜桃| 国产喷白浆一区二区三区| 人人干人人干人人| 欧美涩涩视频| 欧洲一区二区在线| 国产麻豆一区二区三区| 欧美极品少妇xxxxx| 美女做暖暖视频免费在线观看全部网址91 | 国产91丝袜在线播放| 伊人成色综合网| 欧美国产一级| 精品蜜桃一区二区三区| 欧美美女福利视频| 97精品国产91久久久久久| 国产女主播在线直播| 欧美xingq一区二区| 无码一区二区三区在线观看| 一区二区三区**美女毛片| 亚洲熟妇一区二区三区| 国产精品正在播放| wwww.国产| 99精品福利视频| 成人性做爰片免费视频| 一区二区三区四区在线看| 96国产粉嫩美女| 亚洲成人激情社区| 久久久久久久激情视频| 成a人片在线观看www视频| 精品va天堂亚洲国产| 在线免费看毛片| 狠狠躁18三区二区一区| 国产高潮国产高潮久久久91| 久久久久久久久久久电影| 亚洲妇女无套内射精| 青青草97国产精品免费观看| 欧美成人免费在线观看视频| 性欧美欧美巨大69| 欧美激情一区二区三区在线视频| 999久久久久久久久6666| 国产日韩欧美日韩大片| 午夜日韩成人影院| 91av视频在线观看| 黄色污污视频在线观看| 久久精品亚洲国产| eeuss影院www在线观看| 亚洲老头老太hd| 日韩中文字幕影院| 日韩一区和二区| 国产精品女同一区二区| 欧美日韩精品一二三区| 久久人人爽人人爽人人片av免费| 五月天久久比比资源色| 国产成人啪精品午夜在线观看| 亚洲欧美日韩久久| 国产探花视频在线| 国产精品网站在线观看| 中文字幕免费视频| 久久午夜老司机| 蜜桃精品成人影片| 91欧美激情一区二区三区成人| 任你躁av一区二区三区| 成人污污视频在线观看| 亚洲成人福利视频| 国产成人免费在线观看不卡| 免费人成视频在线播放| 国产白丝精品91爽爽久久 | 国产精品xnxxcom| 成人久久18免费网站图片| 国产精品99精品一区二区三区∴| 国产精品户外野外| 国产精品蜜月aⅴ在线| 国产日产久久高清欧美一区| 精品福利在线| 91色视频在线导航| 日韩精品中文字幕一区二区| 操人视频欧美| 日本妇女一区| 日本免费一区二区三区| 99精品美女| 国产人妻人伦精品| 韩国久久久久| 日韩少妇内射免费播放| 美女爽到呻吟久久久久| 一区二区三区 日韩| 国内精品不卡在线| av漫画在线观看| 26uuu另类欧美亚洲曰本| 微拍福利一区二区| 国产精品理伦片| 欧美黑吊大战白妞| 天天综合天天做天天综合| 无码人妻精品一区二| 欧美精品乱码久久久久久按摩 | 欧美91在线|欧美| 亚洲一区亚洲二区| 懂色av一区二区| 欧美日韩亚洲免费| 天堂网在线观看国产精品| 一级黄色片播放| 国产精品久久久久9999高清| 九九热免费精品视频| 国产酒店精品激情| 三级电影在线看| 国产精品人成在线观看免费 | 伊人在线视频| 欧美激情视频网| 欧美在线va视频| 成人av影视在线| 国产一区二区三区站长工具| 日本黄色播放器| 免费日韩av片| 天天操精品视频| 久久久久久久久久久黄色 | 2021av在线| 高清一区二区三区日本久| 天天综合网天天| 国产精品一区二区三区观看| 成人写真视频| 精品少妇在线视频| 久久er精品视频| 国产ts丝袜人妖系列视频 | 在线电影av不卡网址| 成人免费高清观看| 成人精品网站在线观看| 中文精品一区二区| 亚洲色成人www永久在线观看| 蜜臀av一级做a爰片久久| 精品无码人妻少妇久久久久久| 亚洲国产精品ⅴa在线观看| 国产精彩视频在线观看| 欧美精品777| 国产在线色视频| 91超碰caoporn97人人| 香蕉大人久久国产成人av| 色99中文字幕| 美女视频一区免费观看| 亚洲欧美高清在线| 亚洲猫色日本管| 中文字幕日产av| 亚洲图片欧美日产| 欧产日产国产精品视频| 国产精品日韩二区| 中文字幕av亚洲精品一部二部| 一本久道中文无码字幕av| 成人少妇影院yyyy| 欧美精品一区二区蜜桃| 欧美日韩不卡视频| 成年女人的天堂在线| 国产97色在线| 伊人久久大香线蕉无限次| www.av片| 99re在线精品| 永久免费看片在线播放| 精品久久国产字幕高潮| 日本乱理伦在线| 91丝袜脚交足在线播放| 欧美成人嫩草网站| 午夜免费视频网站| 亚洲欧美日韩电影| 国产99久久九九精品无码免费| 日韩日本欧美亚洲| 99精品视频在线免费播放| 亚洲视频在线观看日本a| 日本中文一区二区三区| 卡一卡二卡三在线观看| 在线观看亚洲精品视频| 老司机深夜福利网站| 狠狠做六月爱婷婷综合aⅴ| 亚洲国产精品女人| 国产一区91精品张津瑜| 午夜国产福利一区二区| 欧美一级欧美三级| 主播国产精品| 高清不卡日本v二区在线| 好看不卡的中文字幕| 岛国精品一区二区三区| 婷婷丁香激情综合| 可以在线观看的av网站| 国产精品啪视频| 国产二区精品| 国产xxx在线观看| 午夜久久久影院| 日韩电影网址| 国产精品欧美日韩久久| 99久久精品网站| 99国产精品免费视频| 亚洲福利一区二区| 日本黄在线观看| 国产精品美女www爽爽爽视频| 欧美肥老太太性生活| 性生活在线视频| 福利精品视频在线| 91精品专区| 国产精品国产精品| 国产精品丝袜xxxxxxx| 日本少妇xxxxx| 欧美一区二区三区四区在线观看| 国产嫩草在线视频| 日韩av一区二区三区美女毛片| 精品一二三四在线| 日韩女优在线观看| 一区二区在线视频播放| 久久影院一区二区三区| 国产资源在线视频| 国产精品色婷婷| 欧洲精品久久一区二区| 国产精品第七十二页| 你懂的视频一区二区| 少妇一级淫片免费放播放| 在线日韩一区二区| 色呦呦网站在线观看| 欧美精品一区视频| 国产av无码专区亚洲av毛网站| 欧美电影一区二区三区| 精精国产xxx在线视频app| 午夜精品一区二区三区在线观看 | 亚洲一区二区三区777| 亚洲一级在线| 国产一区二区三区在线视频观看| 亚洲精品福利免费在线观看| 婷婷丁香久久| 男人揉女人奶房视频60分| 亚洲视频一二三| 日产精品久久久久久久性色|