<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當我們需要在Go專案中設計error,就不得不先知道Go error幾種常用方法。標準庫是一個非常好的學習方式,除此之外Go1.13的errors特性也需要掌握。
這裡的判等又分為變數判等和型別判等。
適用於pkg中預先定義好了多個error變數或型別,err只可能是這些變數的其中一個。
案例:os.IsExist(err)
// 變數判等 var errObj = errors.New(errObj) func IsErrObj(err error) bool { return err == errObj } // 型別判等 type PathError struct { Op string Path string Err error } func IsPathError(err error) bool { switch e := err.(type) { case *PathError: return true default: return false } }
適用於構造pkg級別專用的error介面型別,同時在struct中組合Err變數表示底層錯誤
案例:net.Error interface
package net type Error interface { error Timeout() bool // Is the error a timeout? Temporary() bool // Is the error temporary? } type AddrError struct { Err string Addr string }
我們知道Linux有大量的錯誤碼,表示了各種錯誤型別,對於很多系統而言錯誤碼非常好用。Go如何相容這種errono模式呢?
案例:sysacall.Errno
type Errno uintptr func (e Errno) Error() string { if 0 <= int(e) && int(e) < len(errors) { s := errors[e] if s != "" { return s } } return "errno " + itoa.Itoa(int(e)) }
在一些場景下,error是有鏈式關係的,我們固然可以自己實現一種鏈式error型別,但是Go1.13引入了語言級別的支援。它非常簡單,只要3個重要的用法:
// 建立error err2 := fmt.Errorf("%w", err1) // 判斷error鏈條中是否包含某個err變數 ok := errors.Is(err2, err1) // true // 判斷error鏈條中是否可賦值為某個err型別,成功則賦值給target type Errno int func (e *Errno) Error() string { return strconv.Itoa(int(*e)) } func test() { var no = Errno(1) no1 := fmt.Errorf("%w", &no) no2 := fmt.Errorf("%w", no1) var target *Errno ok := errors.As(no2, target) fmt.Println(ok, target) // true, 1 }
以上程式碼都依賴 errors.Unwrap 函數,這個函數通過反射解析出鏈式error的上一個error。
從程式碼可以看出,error.Is 用於我們有2個err變數的情況下,判斷前者是否連結了後者;
error.As 用於我們有一個err變數和一種error型別,想要判斷鏈子中是否包含了這種error型別,如果是,我們順帶將值儲存在target中,相當於丟棄了一些鏈式的資訊,返璞歸真。 這裡有2個注意點:
有時候我們會看到 github.com/pkg/errors 這個包,它其實就是老版本Go想要使用鏈式error所參照的包,它常用的方法是 Wrap 和 Cause,所以看到這2個函數就可以猜到一個專案沒有使用新的errors特性。
到此這篇關於Go error的使用方式選擇的文章就介紹到這了,更多相關Go error使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45