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