精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产色无码精品视频国产| 国产美女三级视频| 精品国产999久久久免费| 91精品精品| 欧美第一区第二区| 国产无套内射久久久国产| www.在线播放| 国产精品亚洲а∨天堂免在线| 久久99热精品| 欧美亚一区二区三区| 久久久人成影片一区二区三区在哪下载| 国产精品妹子av| av一区观看| 国产精品一区无码| 影视亚洲一区二区三区| 日韩电影中文字幕| 黄页网站在线观看视频| 免费av在线电影| 国产一区91精品张津瑜| 欧美精品福利视频| japanese中文字幕| 香蕉免费一区二区三区在线观看| 精品国产999| 亚洲国产一区二区精品视频 | 亚洲va欧美va人人爽成人影院| 亚洲在线视频免费观看| 久久精品二区| 国产深喉视频一区二区| 男人的天堂亚洲| 欧美成人激情在线| 国产三级av在线播放| 日韩免费成人| 欧美性猛交xxxx免费看漫画| 黄色免费高清视频| 免费a级毛片在线观看| 国产福利91精品一区| 日韩美女免费观看| 国产一级免费av| 欧美成免费一区二区视频| 亚洲第一免费播放区| 成人中文字幕在线播放| 菠萝菠萝蜜在线观看| 欧美激情一区二区三区在线| 高清不卡一区二区三区| 亚洲中文字幕在线观看| 天堂精品中文字幕在线| 91国产视频在线| 九九视频免费在线观看| 成人免费在线观看av| 亚洲精品福利免费在线观看| 韩国三级hd中文字幕有哪些| 久久91视频| 色播五月激情综合网| 男人插女人视频在线观看| av毛片在线| 亚洲图片激情小说| 亚洲最大免费| 69av亚洲| 国产精品乱人伦一区二区| 欧美国产综合视频| 日韩精品123| av中文字幕一区| 国产精品一区二区免费看| 国产精品高潮呻吟av| 秋霞国产午夜精品免费视频| 日本国产精品视频| 麻豆chinese极品少妇| 久久久久久久久久久9不雅视频| 夜夜嗨av色一区二区不卡| 国产交换配乱淫视频免费| 婷婷综合成人| 精品视频在线播放免| 久久福利小视频| 大胆国模一区二区三区| 91麻豆精品国产自产在线| www.com黄色片| 国产精品麻豆| 日韩三级视频在线看| 亚洲丝袜在线观看| 91国内精品| 欧美一区二区三区视频在线观看| 午夜一级免费视频| 久久久久久爱| 欧美精品一区男女天堂| 强迫凌虐淫辱の牝奴在线观看| 久久精品福利| 亚洲午夜未删减在线观看| 欧美老熟妇乱大交xxxxx| 久久爱www成人| 亚洲毛片一区二区| 欧美老女人性生活视频| 天天做天天爱天天综合网2021| 久久久999精品免费| 久久久久99精品成人片毛片| 国产欧美三级| 国产精品jvid在线观看蜜臀| 中文亚洲av片在线观看| 国产综合色在线| 国产精品日韩二区| 国产在线观看精品一区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 色一情一乱一乱一91av| 91激情视频在线| 久久伊人久久| 亚洲人成77777在线观看网| 欧美成人短视频| 黄色成人在线网站| 国产91亚洲精品| 国产专区第一页| 久久9热精品视频| 动漫精品视频| 成人在线免费电影| 亚洲一区二区不卡免费| 日本www高清视频| 97视频一区| 中文字幕亚洲欧美一区二区三区| 青青草原免费观看| 久久亚洲色图| 国产福利不卡| 日本中文字幕伦在线观看| 亚洲自拍偷拍麻豆| 亚洲精品视频导航| 老司机aⅴ在线精品导航| 中文字幕日韩在线视频| 日韩精品一区二区三| 精品一区二区免费视频| 久久久综合香蕉尹人综合网| 免费的黄网站在线观看| 一本一本大道香蕉久在线精品 | 欧美重口乱码一区二区| 色呦呦呦在线观看| 欧美性猛交xxxx黑人交| 樱花草www在线| 欧美性感美女一区二区| 久久久视频在线| 国产精品玖玖玖| 国产午夜精品久久久久久免费视| 福利在线小视频| 51一区二区三区| 精品国产乱码久久久久久久| 亚洲色图27p| 99热在线精品观看| 亚洲精品免费网站| 在线日本中文字幕| 色婷婷综合久久久中文一区二区| 一级少妇精品久久久久久久| 97欧美在线视频| 国产精品第10页| 蜜桃成人在线视频| 精品福利在线观看| 在线观看一区二区三区四区| 亚洲人metart人体| 成人情视频高清免费观看电影| 中文字幕在线播放网址| 欧美一区二区三区人| 国产1区2区3区4区| 成人免费看的视频| 国产特级黄色大片| 久久99高清| 国产精品麻豆va在线播放| 阿v免费在线观看| 在线成人av网站| 久久久久久久久久久97| 白白色 亚洲乱淫| 国产真实乱子伦| 欧美精品羞羞答答| 91精品国产综合久久香蕉最新版| 黄色av电影在线观看| 欧美成人艳星乳罩| 日本中文在线播放| 欧美国产禁国产网站cc| www.污网站| 99精品免费视频| 日韩欧美亚洲在线| 激情五月综合婷婷| 97人人爽人人喊人人模波多| 韩国精品视频| 91精品福利在线一区二区三区 | 最近高清中文在线字幕在线观看| 欧美精品一级二级| 男人天堂中文字幕| 国产欧美日韩一区二区三区在线观看| 日本超碰在线观看| 亚洲九九精品| 亚洲精品高清视频| 99re6热只有精品免费观看| 热门国产精品亚洲第一区在线| 午夜免费视频在线国产| 亚洲第一在线视频| 一本一道精品欧美中文字幕| 亚洲在线视频一区| 91成人精品一区二区| 国产91富婆露脸刺激对白| 亚洲乱码中文字幕久久孕妇黑人| 欧美gay男男猛男无套| 精品999在线观看| 日本午夜精品久久久久| 欧美性做爰毛片| gogo在线观看| 国产亚洲欧洲高清一区| 黄色av小说在线观看| 欧美性猛交xxxxxx富婆| 亚洲国产成人精品激情在线| 中文字幕制服丝袜一区二区三区| 国产极品一区二区| 国产一区二区美女诱惑| 妓院一钑片免看黄大片| 亚洲天堂黄色| 国产成人精品免费看在线播放| 天堂俺去俺来也www久久婷婷| 亚洲一区二区三| 国产综合色在线观看| 91sa在线看| 色网在线观看| 美女av一区二区| 日本电影全部在线观看网站视频| 亚洲精品一区中文| 高h震动喷水双性1v1| 91精品国产综合久久久久| 蜜臀99久久精品久久久久小说| 亚洲妇熟xx妇色黄| 国产一区二区视频在线观看免费| 中文字幕精品综合| 天天躁夜夜躁狠狠是什么心态| 成人av电影在线网| 日韩精品国产一区| 国产精品影视在线| 日韩高清在线一区二区| 麻豆精品国产91久久久久久| 国产视频一区二区三区在线播放| 国产亚洲午夜| 少妇人妻在线视频| 在线精品一区| 国产欧美日韩小视频| 国产精品av久久久久久麻豆网| 欧美性受xxxx黑人猛交88| 99tv成人| www亚洲国产| 91精品高清| 99久re热视频精品98| 99精品在线| 久久久国产精华液999999| 欧美h版在线| 四虎免费在线观看视频| 国产精品久久久久蜜臀| 中文字幕欧美日韩一区二区三区| 91视频综合| 伊人久久99| 欧美一区二区| 福利在线一区二区| 国产精品一国产精品k频道56| 阿v天堂2017| 日韩精品乱码免费| 91精品无人成人www| 国产揄拍国内精品对白| 久久黄色一级视频| 成人av在线资源| 国产精品探花一区二区在线观看| 91小视频在线免费看| 亚洲专区区免费| 国产精品欧美经典| 国产67194| 性久久久久久久| 日日夜夜操视频| 欧美日韩久久久| 国产chinasex对白videos麻豆| 精品美女一区二区三区| 免费av在线电影| 日韩在线免费视频观看| 污视频网站在线免费| 久久青草精品视频免费观看| 亚洲日本天堂| 国产噜噜噜噜久久久久久久久| 国产日韩一区二区三免费高清| 国产精品久久久久久久久久久久冷| 啪啪激情综合网| 一区二区精品在线| 亚洲精品字幕| 亚洲一级片网站| 东方欧美亚洲色图在线| 熟女俱乐部一区二区| 亚洲欧美激情视频在线观看一区二区三区| 久热这里只有精品在线| 91福利区一区二区三区| 国产高清在线免费| 国产一区二区欧美日韩| 日本在线观看高清完整版| 日韩av电影手机在线| 懂色av色香蕉一区二区蜜桃| 久久综合狠狠综合久久综青草 | 久久噜噜亚洲综合| 91视频青青草| 色综合久久精品| 国产成人久久精品77777综合 | 级毛片内射视频| 一区二区欧美在线观看| 国产免费a视频| 精品对白一区国产伦| 国产精品一区二区婷婷| 欧美高清在线观看| 高清亚洲高清| 麻豆久久久av免费| 欧美区亚洲区| 粉色视频免费看| 久久午夜老司机| 国产亚洲欧美久久久久| 欧美日韩国产高清一区二区三区| 日本精品999| 欧美大尺度激情区在线播放 | 欧美日产国产精品| 久蕉在线视频| 91福利视频在线观看| 99ri日韩精品视频| 日本一级淫片演员| 秋霞影院一区二区| 波多野结衣 在线| 亚洲成av人片一区二区三区| 国产视频第一页| 中文综合在线观看| 日韩高清在线| 欧美一区二区视频在线| 亚洲精品影视| 午夜免费福利影院| 亚洲精品国产视频| 99久久精品国产一区二区成人| 在线精品播放av| 在线精品亚洲欧美日韩国产| 国内一区二区三区在线视频| 国产综合自拍| 91av免费观看| 亚洲精选视频在线| 国产视频一区二区三区四区五区| 深夜福利国产精品| 国产激情久久| 一区二区三区av| 久久精品国内一区二区三区| 美国美女黄色片| 欧美日本乱大交xxxxx| 在线播放麻豆| 国产这里只有精品| 99久久精品网站| 日本网站在线看| 一区二区三区高清| 欧洲av在线播放| 97在线视频免费观看| 欧美日韩一区二区三区在线电影| 欧美一级欧美一级| 99久久精品国产毛片| 欧美特黄aaaaaa| 亚洲最新在线视频| 亚洲精品成a人ⅴ香蕉片| 最新精品视频| 成人性生交大片免费看中文| 久久精品视频日本| 国产视频在线一区二区| 日韩伦理三区| 亚洲午夜精品一区二区三区| 黄色精品一二区| 久久国产免费观看| 亚洲精品第一国产综合精品| 电影天堂国产精品| 在线视频精品一区| 国产黄色精品视频| 国产一区二区99| 在线观看亚洲区| 日韩精品成人| 日韩中文字幕三区| 欧美国产日本韩| 国产xxxx孕妇| 欧美在线亚洲一区| 99久久视频| 午夜男人的天堂| 欧美亚洲动漫精品| 亚洲性图自拍| 快播亚洲色图| 经典一区二区三区| 国产乡下妇女做爰| 一区二区三区黄色| 色妞ww精品视频7777| 成年人免费在线播放| 亚洲四区在线观看| 无码精品人妻一区二区三区影院| 国产精品视频一区二区三区四| 91av精品| 醉酒壮男gay强迫野外xx| 欧美电影一区二区三区| 涩涩视频在线播放| 一二三四中文字幕| 久久欧美中文字幕| 亚洲xxx在线| 国产精品美女免费| 在线视频观看日韩| 午夜精品久久久久99蜜桃最新版| 欧美mv日韩mv亚洲| 久久69成人| 女性女同性aⅴ免费观女性恋| 亚洲欧洲日本在线| 清纯唯美亚洲色图| 国产精品xxxx| 国产一区在线观看麻豆|