最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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幾種常用方法。標(biāo)準(zhǔn)庫是一個非常好的學(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)建更強(qiáng)大的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是有鏈?zhǔn)疥P(guān)系的,我們固然可以自己實現(xiàn)一種鏈?zhǔn)絜rror類型,但是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ù)通過反射解析出鏈?zhǔn)絜rror的上一個error。
從代碼可以看出,error.Is 用于我們有2個err變量的情況下,判斷前者是否鏈接了后者;
error.As 用于我們有一個err變量和一種error類型,想要判斷鏈子中是否包含了這種error類型,如果是,我們順帶將值保存在target中,相當(dāng)于丟棄了一些鏈?zhǔn)降男畔?,返璞歸真。 這里有2個注意點(diǎn):

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

5. Go版本低時的鏈?zhǔn)絜rror

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

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

相關(guān)文章

  • Go語言Telnet回音服務(wù)器的實現(xiàn)

    Go語言Telnet回音服務(wù)器的實現(xiàn)

    這篇文章主要介紹了Go語言Telnet回音服務(wù)器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Go語言列表List獲取元素的4種方式

    Go語言列表List獲取元素的4種方式

    Golang的列表元素的獲取可以使用內(nèi)置的 Front 函數(shù)獲取頭結(jié)點(diǎn),使用 Back 函數(shù)獲取尾結(jié)點(diǎn),使用 Prev 獲取前一個結(jié)點(diǎn),使用 Next 獲取下一個結(jié)點(diǎn),本文就介紹了Go語言列表List獲取元素的4種方式,感興趣的可以了解一下
    2022-04-04
  • golang官方嵌入文件到可執(zhí)行程序的示例詳解

    golang官方嵌入文件到可執(zhí)行程序的示例詳解

    這篇文章主要介紹了golang官方嵌入文件到可執(zhí)行程序,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Go語言命令行參數(shù)及cobra使用方法

    Go語言命令行參數(shù)及cobra使用方法

    Cobra是關(guān)于golang的一個命令行解析庫,用它能夠快速創(chuàng)建功能強(qiáng)大的 cli應(yīng)用程序和命令行工具,本文主要介紹了Go語言命令行參數(shù)及cobra使用方法,感興趣的可以了解一下
    2024-01-01
  • 詳解如何在Golang中實現(xiàn)CORS(跨域)

    詳解如何在Golang中實現(xiàn)CORS(跨域)

    很多時候,需要允許Web應(yīng)用程序在不同域之間(跨域)實現(xiàn)共享資源,本文將簡介跨域、CORS的概念,以及如何在Golang中如何實現(xiàn)CORS,文中有詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-10-10
  • Golang 使用map需要注意的幾個點(diǎn)

    Golang 使用map需要注意的幾個點(diǎn)

    這篇文章主要介紹了Golang 使用map需要注意的幾個點(diǎn),幫助大家更好的理解和學(xué)習(xí)golang,感興趣的朋友可以了解下
    2020-09-09
  • golang簡單讀寫文件示例

    golang簡單讀寫文件示例

    這篇文章主要介紹了golang簡單讀寫文件的方法,實例分析了Go簡單文件讀取與寫入操作的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • golang時間、時區(qū)、格式的使用方法

    golang時間、時區(qū)、格式的使用方法

    這篇文章主要介紹了golang時間、時區(qū)、格式的使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • go mock server的簡易實現(xiàn)示例

    go mock server的簡易實現(xiàn)示例

    這篇文章主要為大家介紹了go mock server的簡易實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Go語言區(qū)別于其他語言的特性

    Go語言區(qū)別于其他語言的特性

    在本文中,今天這篇文章將給大家介紹一下 Go 與其他語言不同的 9 個特性,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-10-10

最新評論

贵南县| 綦江县| 安国市| 新龙县| 靖远县| 福安市| 余江县| 盈江县| 江华| 台湾省| 武强县| 无为县| 德庆县| 汕尾市| 防城港市| 吉隆县| 余姚市| 遵义市| 科技| 大同市| 莲花县| 长治县| 棋牌| 浑源县| 景宁| 客服| 隆昌县| 三穗县| 黄平县| 荥阳市| 甘谷县| 武平县| 辽中县| 新源县| 渭源县| 高陵县| 双峰县| 株洲县| 平阴县| 永善县| 龙泉市|