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

Go?error的使用方式詳解

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

概述

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

error使用方式

1.直接判等

這里的判等又分為變量判等和類型判等。
適用于pkg中預(yù)先定義好了多個(gè)error變量或類型,err只可能是這些變量的其中一個(gè)。
案例: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接口類型,同時(shí)在struct中組合Err變量表示底層錯(cuò)誤
案例: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有大量的錯(cuò)誤碼,表示了各種錯(cuò)誤類型,對于很多系統(tǒng)而言錯(cuò)誤碼非常好用。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)系的,我們固然可以自己實(shí)現(xiàn)一種鏈?zhǔn)絜rror類型,但是Go1.13引入了語言級別的支持。它非常簡單,只要3個(gè)重要的用法:

// 創(chuàng)建error
err2 := fmt.Errorf("%w", err1)
// 判斷error鏈條中是否包含某個(gè)err變量
ok := errors.Is(err2, err1) // true
// 判斷error鏈條中是否可賦值為某個(gè)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ù),這個(gè)函數(shù)通過反射解析出鏈?zhǔn)絜rror的上一個(gè)error。
從代碼可以看出,error.Is 用于我們有2個(gè)err變量的情況下,判斷前者是否鏈接了后者;
error.As 用于我們有一個(gè)err變量和一種error類型,想要判斷鏈子中是否包含了這種error類型,如果是,我們順帶將值保存在target中,相當(dāng)于丟棄了一些鏈?zhǔn)降男畔ⅲ佃睔w真。 這里有2個(gè)注意點(diǎn):

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

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

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

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

相關(guān)文章

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

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

    這篇文章主要介紹了Go語言Telnet回音服務(wù)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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 獲取前一個(gè)結(jié)點(diǎn),使用 Next 獲取下一個(gè)結(jié)點(diǎn),本文就介紹了Go語言列表List獲取元素的4種方式,感興趣的可以了解一下
    2022-04-04
  • golang官方嵌入文件到可執(zhí)行程序的示例詳解

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

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

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

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

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

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

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

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

    golang簡單讀寫文件示例

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

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

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

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

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

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

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

最新評論

新竹市| 榆中县| 宝清县| 兴仁县| 上高县| 秭归县| 武邑县| 洪泽县| 兴国县| 抚松县| 三都| 长子县| 阜康市| 广安市| 乐陵市| 宜昌市| 西乌珠穆沁旗| 曲周县| 望谟县| 南陵县| 安图县| 织金县| 平湖市| 毕节市| 南和县| 宁乡县| 哈密市| 苍梧县| 石景山区| 平罗县| 建阳市| 洱源县| 河西区| 太和县| 陈巴尔虎旗| 余江县| 筠连县| 巴楚县| 大化| 临江市| 延寿县|