iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go error的使用方式详解
  • 529
分享到

Go error的使用方式详解

GOerror 2022-06-07 20:06:04 529人浏览 八月长安
摘要

目录概述error使用方式1.直接判等2.组合error接口,构建更强大的error接口3.Errno模式4.Go1.13的Wrap模式5. Go版本低时的链式error概述

目录

概述

error使用方式

1.直接判等

2.组合error接口,构建更强大的error接口

3.Errno模式

4.Go1.13的Wrap模式

5. Go版本低时的链式error

概述

当我们需要在Go项目中设计error,就不得不先知道Go error几种常用方法。标准库是一个非常好的学习方式,除此之外Go1.13的errors特性也需要掌握。

error使用方式 1.直接判等

这里的判等又分为变量判等和类型判等。
适用于pkg中预先定义好了多个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接口,构建更强大的error接口

适用于构造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有大量的错误码,表示了各种错误类型,对于很多系统而言错误码非常好用。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是有链式关系的,我们固然可以自己实现一种链式error类型,但是Go1.13引入了语言级别的支持。它非常简单,只要3个重要的用法:

// 创建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 函数,这个函数通过反射解析出链式error的上一个error。
从代码可以看出,error.Is 用于我们有2个err变量的情况下,判断前者是否链接了后者;
error.As 用于我们有一个err变量和一种error类型,想要判断链子中是否包含了这种error类型,如果是,我们顺带将值保存在target中,相当于丢弃了一些链式的信息,返璞归真。 这里有2个注意点:

Unwrap依赖反射,我们知道Go的反射是很慢的,所以需要考虑性能的场景慎用

As函数使用是,target本身必须是struct的指针类型,并且要取地址,否则可能会panic

5. Go版本低时的链式error

有时候我们会看到 GitHub.com/pkg/errors 这个包,它其实就是老版本Go想要使用链式error所引用的包,它常用的方法是 Wrap 和 Cause,所以看到这2个函数就可以猜到一个项目没有使用新的errors特性。

到此这篇关于Go error的使用方式选择的文章就介绍到这了,更多相关Go error使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!


您可能感兴趣的文档:

--结束END--

本文标题: Go error的使用方式详解

本文链接: https://www.lsjlt.com/news/30701.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go WaitGroup的使用方式及实例详解
    WaitGroup 是 Go 语言的一个并发控制机制,它可以用于等待一组 goroutine 的结束。WaitGroup 提供了三个...
    99+
    2023-10-12
    Go语言
  • OpenTelemetry-go的SDK使用方法详解
    目录例子原理方法使用newExporternewResourcetrace.NewTracerProviderotel注意获取当前跨度设置span状态设置span属性记录错误设置活动...
    99+
    2024-04-02
  • 详解go mod 使用方法
    目录1、进入grammar文件夹2、初始化目录3、导入自定义的模块4、导入本地没有的模块常用命令1、初始化模块2 、获取远程的模块3、 查看当前依赖模块4、清除未使用到的依赖go m...
    99+
    2024-04-02
  • Go语言常用的打log方式详解
    文章介绍了3种常用的打log的方式,并赋上了注解 先写上注意事项,三种方法建议分开测,因为可能在第一种的Fatal会终止运行,Fatal和Panic和Print的区别在于,Fatal...
    99+
    2024-04-02
  • 详解Pythonprometheus_client使用方式
    背景说明 服务部署在阿里云的K8s上,配置了基于Prometheus的Grafana监控。原本用的是自定义的Metrics接口统计,上报一些字段,后面发现Prometheus自带的监...
    99+
    2024-04-02
  • 详解PHP调用Go服务的正确方式
    目录问题服务耦合服务抽取Unix Domain Sockets进程间通信简单介绍适用场景代码实现Go 实现的 Trie 树Go ServerPHP Client小结效率杂谈问题 服务...
    99+
    2024-04-02
  • mysql中json的使用方式详解
    目录一、插入json数据的方式有两种二、查询 JSON 中字段的数据三、JSON字段的条件搜索mysql字段的数据类型支持json格式,可以直接存储json数组和json对象。 一、插入json数据的方式有两种 1、以普...
    99+
    2023-04-23
    mysql中json使用 mysql json
  • Javasynchronized与CAS使用方式详解
    目录引言synchronizedsynchronized的三种使用方式synchronized的底层原理JDK1.6对synchronized的优化synchronized的等待唤醒...
    99+
    2023-01-16
    Java CAS Java synchronized
  • Go语言中函数的使用方法详解
    目录函数特点函数知识点函数的使用函数定义函数的参数函数的返回值函数的变量作用域函数的递归调用函数的可变参数函数的闭包函数的 defer 语句注意函数特点 函数可以有多个返回值。可以将...
    99+
    2023-05-18
    Go语言函数使用方法 Go语言函数使用 Go语言函数
  • Go语言中rune方法使用详解
    Go语言中rune方法如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 1.byte类型 byt...
    99+
    2023-03-19
    Go语言rune方法 Go语言rune
  • 详解Python列表解析式的使用方法
    目录列表解析式的优势如何在 Python 中创建列表循环map() 对象列表解析式哪种方法更有效高级解析式条件逻辑集合解析式字典解析式海象运算符什么时候不要使用解析式注意嵌套的解析式...
    99+
    2024-04-02
  • Python Requests使用Cookie的几种方式详解
    目录前言一、通过headers参数使用二、通过cookies参数使用三、通过Session会话使用方式0:自动设置方式1:通过key设置方式2:通过set 方法设置方式3:通过 ad...
    99+
    2023-08-08
    python requests cookie python cookie
  • 详解Flutter中key的正确使用方式
    目录1、什么是key2、key的更新原理3、key的分类GlobalKeyLocalKey总结1、什么是key Widget中有个可选属性key,顾名思义,它是组件的标识符,当设置...
    99+
    2023-01-28
    Flutter key使用方式 Flutter key
  • 关于.NET6 Minimal API的使用方式详解
    目录前言使用方式几行代码构建Web程序更改监听地址日志操作基础环境配置主机相关设置默认容器替换中间件相关请求处理路由约束模型绑定绑定示例自定义绑定总结前言 随着.Net6的发布,微软...
    99+
    2024-04-02
  • Go字典使用详解
    目录存储/查找原理限制字典声明字典赋值特殊类型修改值字典遍历总结字典特性和许多编程语言一样,在 Go 中,字典是一组键-值对( Go 中称键-元素对)的集合。 存储/查找原理 当我们...
    99+
    2022-11-21
    Go字典 Golang字典
  • CentOS的详细使用方式
    这篇文章主要讲解了“CentOS的详细使用方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CentOS的详细使用方式”吧!CentOS对大家来说已经很熟悉。什么是CentOS呢?CentO...
    99+
    2023-06-16
  • Go语言多行注释的使用方法详解
    标题:Go语言多行注释的使用方法详解 Go语言是一种编译型语言,由谷歌开发,其简洁的语法和高效的性能受到广泛关注和喜爱。在Go语言中,注释是一种非常重要的编程元素,可以帮助程序员理解代...
    99+
    2024-04-02
  • GO的range如何使用详解
    目录GO 语言的 for…range 能做什么呢?for…range 如何使用 数组 array切片 slicemap 哈希表channel 通道for&...
    99+
    2023-02-10
    GO range使用 GO range
  • Go语言HttpRouter路由使用方法详解
    HttpRouter是一个轻量级但却非常高效的multiplexer。手册: https://godoc.org/github.com/julienschmidt/httproute...
    99+
    2024-04-02
  • Go语言JSON解析器gjson使用方法详解
    目录gjson安装使用gjson GJSON 是一个Go包,它提供了一种从json文档中获取值的快速简单的方法。它具有单行检索、点符号路径、迭代和解析 json 行等功能。 还可以查...
    99+
    2022-12-08
    Go 解析器gjson Go JSON解析器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作