AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

聊聊Golang飽受爭議的Error

來源: 責編: 時間:2023-11-06 17:20:06 288觀看
導讀一、error是什么?在C中,返回錯誤通過errno.h中的錯誤代碼來表示,比如0代表No error,也就是沒有錯誤;2代表No such file or directory,也就是找不到指定路徑的文件或文件夾;5代表Input/Output error,表示輸入或輸出出現了錯誤.

一、error是什么?

在C中,返回錯誤通過errno.h中的錯誤代碼來表示,比如0代表No error,也就是沒有錯誤;2代表No such file or directory,也就是找不到指定路徑的文件或文件夾;5代表Input/Output error,表示輸入或輸出出現了錯誤...MMY28資訊網——每日最新資訊28at.com

而在我們最愛的Golang中,有這樣一個飽受爭議的error類型,它不是一個整數,而是一個接口。MMY28資訊網——每日最新資訊28at.com

package mainimport (    "errors"    "fmt")type name struct {    error string}func (n *name) Error() string {    return fmt.Sprintf("%s : ...", n.error)}func main() {        err := judge(11)    //err := judge(1)    //err := judge(6)    fmt.Println(err)}func judge(num int) error {    if num > 5 && num < 10 {        return errors.New("這個數字大于5了..")    }    if num >= 10 {        return fmt.Errorf("%d大于或等于10了...", num)    }    return &name{error: "hello"}}

這是三種可以作為error返回值的方式。errors.New()創建出來的error類型其實是errorString結構體。MMY28資訊網——每日最新資訊28at.com

// src/errors/errors.go// New returns an error that formats as the given text.// Each call to New returns a distinct error value even if the text is identical.func New(text string) error { return &errorString{text}}// errorString is a trivial implementation of error.type errorString struct { s string}func (e *errorString) Error() string { return e.s}

所以我們創建的結構體name其實和errors.New()底層的形式是基本一樣的。MMY28資訊網——每日最新資訊28at.com

而使用的fmt.Errorf其實是先將字符串格式化然后再調用errors.New()。MMY28資訊網——每日最新資訊28at.com

二、error引人爭論的點在哪?

在Go中,設計者從語言層面要求人們需要明確地處理遇到的錯誤,但是因此導致的問題也十分明顯,使用Go語言編寫的代碼中err會到處都是,不過優秀的IDE——Goland能夠解決這個問題,使用Goland能夠將err!=nil這段判斷和處理壓縮,不再干擾代碼的閱讀。MMY28資訊網——每日最新資訊28at.com

我本人是不太喜歡Java的try-catch機制,可能是不太會用,Go語言官方提到try-catch會讓代碼變得比較混亂,很多程序員會胡亂catch異常,導致錯誤處理比較冗長。MMY28資訊網——每日最新資訊28at.com

而Go語言通過多返回值機制,讓返回錯誤變得很簡單,并且提供panic和error兩種機制,感覺這種機制更有優勢,也看起來更簡潔。MMY28資訊網——每日最新資訊28at.com

煎魚大佬之前有博客談到了Go社區中關于Go錯誤處理的新議題,大家想了解的可以看看:MMY28資訊網——每日最新資訊28at.com

  • Go 錯誤處理新思路?用左側函數和表達式:https://juejin.cn/post/7102268049213882398
  • Go try 新提案靠譜嗎?想簡化錯誤處理了 https://juejin.cn/post/7157931922008571940

其實之前Go社區中出現過多種關于錯誤處理的新議題,但是都沒有被采納...MMY28資訊網——每日最新資訊28at.com

三、如何優雅的處理錯誤

1. 避免處理“哨兵錯誤”,即Sentinel errors

比如為了判斷err == io.EOF就得引入io包,這是標準庫的包還能接受,如果是第三方庫的包,并且使用“哨兵錯誤”,很容易導致循環引用的問題。MMY28資訊網——每日最新資訊28at.com

2. 避免使用error類型

雖然這種錯誤比“哨兵錯誤”要好,它可以捕獲更多關于錯誤的上下文信息,比如出錯的行數等其他字段信息。但是又不可避免地在定義錯誤和使用錯誤的包之間形成依賴關系,又容易導致循環引用的問題。MMY28資訊網——每日最新資訊28at.com

3. 使用不透明的“黑盒錯誤”
func f() error{    sentence,err := say.Hello()    if err != nil{        return err    }    // ...}

上面這種寫法是不是我們經常會用到?這種情況下,我們只需要判斷err是否為空,不為空,代表有錯誤,就直接返回錯誤,否則就繼續執行后面的流程。MMY28資訊網——每日最新資訊28at.com

作為程序執行者,你沒有能力看到程序錯誤的內部信息,只能知道程序有錯或者沒有錯誤。這種錯誤處理作為一種調試輔助手段還是不錯的。MMY28資訊網——每日最新資訊28at.com

4. 使用Warp和Cause

第三方庫github.com/pkg/errors可以輸出錯誤堆棧,并且使用起來很簡單,大家可以了解一下。MMY28資訊網——每日最新資訊28at.com

// Wrap annotates cause with a message.func Wrap(cause error, message string) error// Cause unwraps an annotated error.func Cause(err error) error

下面來介紹Wrap和Cause的使用樣例:MMY28資訊網——每日最新資訊28at.com

func ReadFile(path string) ([]byte, error) {        f, err := os.Open(path)        if err != nil {                return nil, errors.Wrap(err, "open failed")        }        defer f.Close()        buf, err := ioutil.ReadAll(f)        if err != nil {                return nil, errors.Wrap(err, "read failed")        }        return buf, nil}func ReadConfig() ([]byte, error) {        home := os.Getenv("HOME")        config, err := ReadFile(filepath.Join(home, ".settings.xml"))        return config, errors.Wrap(err, "could not read config")}func main() {        _, err := ReadConfig()        if err != nil {                fmt.Println(err)                os.Exit(1)        }}

如果ReadConfig()執行失敗,就會得到下面這一行十分美觀的報錯:MMY28資訊網——每日最新資訊28at.com

could not read config: open failed: open /Users/dfc/.settings.xml: no such file or directory

而如果用fmt.Printf和%+v格式來輸出就能看到更清晰、更有層次的錯誤堆棧:MMY28資訊網——每日最新資訊28at.com

func main() {        _, err := ReadConfig()        if err != nil {                fmt.Printf("%+v",err)                os.Exit(1)        }}

圖片圖片MMY28資訊網——每日最新資訊28at.com

然后我們再來看Cause的使用。MMY28資訊網——每日最新資訊28at.com

type temporary interface{    Temporary() bool}// IsTemporary returns true if err is temporary.func IsTemporary(err error) bool {        te, ok := errors.Cause(err).(temporary)        return ok && te.Temporary()}

當需要檢查一個錯誤與一個特定的值或類型時。比如此處,先用Cause取出錯誤,做斷言,最后調用Temporary(),如果斷言失敗,ok就會是false,就不會調用右邊的Temporary()去執行。MMY28資訊網——每日最新資訊28at.com

如果 && 運算符左側的子表達式為 false,則不會檢查右側的表達式。因為只要有一個子表達式為 false,則整個表達式都為 false,所以再檢查剩余的表達式會浪費 CPU 時間。這被稱為短路評估。MMY28資訊網——每日最新資訊28at.com

本文轉載自微信公眾號「 程序員升級打怪之旅」,作者「 丘山子&王中陽Go」,可以通過以下二維碼關注。MMY28資訊網——每日最新資訊28at.com

MMY28資訊網——每日最新資訊28at.com

轉載本文請聯系「 程序員升級打怪之旅」公眾號。MMY28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-17287-0.html聊聊Golang飽受爭議的Error

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 快速了解CSS 相對顏色

下一篇: 開發微服務的九個最佳實踐

標簽:
  • 熱門焦點
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • 網傳小米汽車開始篩選交付中心 建筑面積不低于3000平方米

    7月7日消息,近日有微博網友@長三角行健者爆料稱,據經銷商集團反饋,小米汽車目前已經開始了交付中心的篩選工作,要求候選場地至少有120個車位,建筑不能低
  • 2納米決戰2025

    集微網報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進制程領先地位的英特爾,甚至初成立不久的新
  • iQOO 11S屏幕細節公布:首發三星2K E6全感屏 安卓最好的直屏手機

    日前iQOO手機官方宣布,新一代電競旗艦iQOO 11S將會在7月4日19:00正式與大家見面。隨著發布時間的日益臨近,官方關于該機的預熱也更加密集,截至目前已
  • 2022爆款:ROG魔霸6 冰川散熱系統持續護航

    喜逢開學季,各大商家開始推出自己的新產品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現在的
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top