欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?error的使用方式詳解

 更新時間:2022年05月30日 10:46:02   作者:Flappy  
當(dāng)我們需要在Go項目中設(shè)計error,就不得不先知道Go error幾種常用方法,今天通過本文給大家介紹Go?error的使用方式詳解,感興趣的朋友一起看看吧

概述

當(dāng)我們需要在Go項目中設(shè)計error,就不得不先知道Go error幾種常用方法。標準庫是一個非常好的學(xué)習(xí)方式,除此之外Go1.13的errors特性也需要掌握。

error使用方式

1.直接判等

這里的判等又分為變量判等和類型判等。
適用于pkg中預(yù)先定義好了多個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
    }
} 

2.組合error接口,構(gòu)建更強大的error接口

適用于構(gòu)造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
}

3.Errno模式

我們知道Linux有大量的錯誤碼,表示了各種錯誤類型,對于很多系統(tǒng)而言錯誤碼非常好用。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))
}

4.Go1.13的Wrap模式

在一些場景下,error是有鏈式關(guān)系的,我們固然可以自己實現(xiàn)一種鏈式error類型,但是Go1.13引入了語言級別的支持。它非常簡單,只要3個重要的用法:

// 創(chuàng)建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 函數(shù),這個函數(shù)通過反射解析出鏈式error的上一個error。
從代碼可以看出,error.Is 用于我們有2個err變量的情況下,判斷前者是否鏈接了后者;
error.As 用于我們有一個err變量和一種error類型,想要判斷鏈子中是否包含了這種error類型,如果是,我們順帶將值保存在target中,相當(dāng)于丟棄了一些鏈式的信息,返璞歸真。 這里有2個注意點:

  • Unwrap依賴反射,我們知道Go的反射是很慢的,所以需要考慮性能的場景慎用
  • As函數(shù)使用是,target本身必須是struct的指針類型,并且要取地址,否則可能會panic

5. Go版本低時的鏈式error

有時候我們會看到 github.com/pkg/errors 這個包,它其實就是老版本Go想要使用鏈式error所引用的包,它常用的方法是 Wrap 和 Cause,所以看到這2個函數(shù)就可以猜到一個項目沒有使用新的errors特性。

到此這篇關(guān)于Go error的使用方式選擇的文章就介紹到這了,更多相關(guān)Go error使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言入門13之runtime包案例講解

    Go語言入門13之runtime包案例講解

    這篇文章主要介紹了Go語言入門runtime包相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • go chan基本使用詳解

    go chan基本使用詳解

    本文主要介紹了go chan基本使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒有什么辦法能夠?qū)⒏郊?nèi)容直接打包進可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • golang逗號ok模式整合demo

    golang逗號ok模式整合demo

    這篇文章主要為大家介紹了golang逗號ok模式整合demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 使用go自定義prometheus的exporter

    使用go自定義prometheus的exporter

    在prometheus中如果要監(jiān)控服務(wù)器和應(yīng)用的各種指標,需要用各種各樣的exporter服務(wù),這篇文章主要介紹了使用go自定義prometheus的exporter,需要的朋友可以參考下
    2023-03-03
  • 使用go語言將單反斜杠改為雙反斜杠的方法

    使用go語言將單反斜杠改為雙反斜杠的方法

    最近開發(fā)的時候遇到這么個問題,就是在window上獲取了文件目錄的字段,然后將這個絕對路徑保存到數(shù)據(jù)庫,但是前端展示的時候路徑的雙反斜杠變成了單反斜杠,本文給大家介紹了使用go語言將單反斜杠改為雙反斜杠的方法,需要的朋友可以參考下
    2024-01-01
  • Go語言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例

    Go語言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例

    這篇文章主要為大家介紹了Go語言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 解決go mod私有倉庫拉取的問題

    解決go mod私有倉庫拉取的問題

    這篇文章主要介紹了解決go mod私有倉庫拉取的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Golang WaitGroup實現(xiàn)原理解析

    Golang WaitGroup實現(xiàn)原理解析

    WaitGroup是Golang并發(fā)的兩種方式之一,一個是Channel,另一個是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法

    Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法

    這篇文章主要介紹了Go語言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法,是golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10

最新評論