Go中“哨兵錯(cuò)誤”說法的由來及使用建議
大家好,我是漁夫子。
前些天有網(wǎng)友問我,在golang的錯(cuò)誤處理中,“哨兵錯(cuò)誤(sentinel error)”這個(gè)詞的出處。之前我也只是在一些書籍和資料中見到過,也沒深究。當(dāng)這個(gè)網(wǎng)友問了我之后,就深入的翻了翻資料,在golang的官方博客中找到了這個(gè)詞的提法,也算是比較官方的了吧。如下:https://go.dev/blog/go1.13-errors
圖片
因?yàn)樵趃olang中錯(cuò)誤也被當(dāng)做值來處理的。所以是叫做錯(cuò)誤的哨兵值,也就是大家常看到的哨兵錯(cuò)誤。
哨兵錯(cuò)誤注意事項(xiàng)
在go的官方博客中也提到,哨兵錯(cuò)誤是包級別的,可以用于在包外進(jìn)行錯(cuò)誤值的判斷。如下:
圖片
但是,這樣會造成包和包之間的依賴。如果哨兵錯(cuò)誤做了修改,那么之前依賴該錯(cuò)誤的所有包都需要更改。
但在go1.13版本之后,增加了errors.Is方法。那么就建議,如果一個(gè)函數(shù)的返回值是哨兵錯(cuò)誤,那么應(yīng)該對該哨兵錯(cuò)誤進(jìn)行包裝后再返回。同時(shí),在調(diào)用方使用errors.Is函數(shù)來判斷是否是某個(gè)具體的哨兵錯(cuò)誤。如下:
圖片
總結(jié)
本文追溯了“哨兵錯(cuò)誤”概念的提出來源,算是比較官方的。同時(shí)介紹了函數(shù)返回哨兵錯(cuò)誤時(shí)需要包裝后再返回。