go1.13 中 errors 包的 Is 与 As 方法
虽说现在都已经 go 1.14 了,才想起来写一下 go 1.13 中引入的 error 的处理方法。
先放 go blog 中的链接: go1.13-errors
这篇博文主要阐述了之前关于 error 类型处理的方法,我们经常会在处理 error 的时候需要添加一些有用的上下文信息,之前常用的做法是使用 github.com/pkg/errors
这个包里的 errors.WithMessage
方法,或者是 errors.WithStack
方法。如果想从结果 err 中得到原始 error 的话,就调用 err.Cause()
方法。
但是这样会有一个问题,就是如果 error 包裹的太深的话,就只能一层一层的拆开去检验。
不过不用担心,go 1.13 新出的 errors 包就解决了这个问题。它添加了 errors.Is
和 errors.As
两个方法来处理 error。
具体的使用方法大家可以参考这篇文章: Go 1.13中的错误处理
我这篇博文中主要想强调一个踩到的坑,就是 errors.As
方法中的第二个参数,也就是 target
。在函数声明中,target 是一个空接口,即可以传任意类型。但是根据 As
函数的定义,我们可以看出来,target
必须是一个 “指向一个实现了 error
接口” 的指针 (如果你使用的是 jetbrains 的 IDE 的话,它也会在编辑器中提示你的)。
正是这里,会导致一个小问题,就是如果有一个 Foo
类型结构体,实现了 Error()
方法,但是该方法的接收者是指针类型,即:
type Foo struct{}func (f *Foo) Error() string {return "this is an foo error"
}
这样其实 Foo
与 *Foo
都是 error
接口。所以在如果返回的 err
是 *Foo
类型,而你的代码是这样写的:
func Bar() {err := someFuncReturnPointerFoo() // *Foovar tErr Foofmt.Println(errors.As(err, &tErr))// Output: false
}
期望将 err
作为 Foo
类型来处理,可以编译通过,但无法得到想要的结果。
因为 tErr
是 Foo
类型,而 err
实际是 *Foo
类型。
所以我们需要将上边代码第三行,声明 tErr
的位置改为 *Foo
即可。
go1.13 中 errors 包的 Is 与 As 方法相关推荐
- anaconda怎么使用python包_Anaconda中python包的介绍与使用方法
Anaconda中python包的介绍与使用方法 目录: 1.包的定义 2.常用包管理器 3.包管理器的使用方法 4.数据科学常用的包 1.包的定义 由多个和同一功能相关的模块组成,通常为含有_ini ...
- 06 Errors For Go1.13
Errors before For 1.13 最简单的错误检查: if err != nil {// sth went wrong } 有事我们需要对sentinel error进行检查: var E ...
- go error接口与errors包详解
文章目录 错误包需要具有哪些功能? 1. 应该能支持错误堆栈 2. 能够支持不同的打印格式 3. 能支持 Wrap/Unwrap 功能,也就是在已有的错误上,追加一些新的信息 4. 错误包应该有Is方 ...
- java中不同包中怎么实例化,Java 笔试题 (01)
Java 笔试题 1.有1.2.3.4.5个数字,能组成多少个互不相同且无重复数字的四位数?都是多少? 提示:可填在千位.百位.十位.个位的数字都是1.2.3.4.5.组成所有的排列后再去 掉不满足条 ...
- Windows中使用包管理器(类似于apt/yum的) - Chocolatey
Windows中使用包管理器 - Chocolatey简介 李俊才 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_2 ...
- 从项目的一个 panic 说起:Go 中 Sync 包的分析应用
项目开发中遇到一个错误 "fatal error: concurrent map read and map write". 有过一两年 Golang 开发经验的同学应该都不陌生,这 ...
- golang中的包管理工具——govendor和godep简单学习
为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...
- 浅析Python中signal包的使用
原文链接:https://www.jb51.net/article/74844.htm 这篇文章主要介绍了Python中signal包的使用,主要在Linux系统下对进程信号进行相关操作,需要的朋友可 ...
- Beetl2.7.13 中文文档
## Beetl2.7.13 中文文档 ### 1. 什么是Beetl Beetl目前版本是2.7.13,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使 ...
- ubuntu中抓包工具tcpdump使用详解
简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...
最新文章
- 针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部552-556条
- Linux下CMake简明教程(七)对库进行链接
- PHPCMS v9设置文章的审核功能
- VTK:ShareCamera分享相机用法实战
- local path of sap-ui-core-less-140903345-dbg.js
- centos7 安装cacti
- System.Threading.Thread类方法
- jq追加元素最前面_DNF:哈林史诗百鬼夜行最理想的首饰搭配,海博伦应选贤者之欲...
- [深度学习] 深度学习常见概念
- oracle时间去掉时分秒的时间_超详细的oracle修改AWR采样时间间隔和快照保留时间教程...
- Building libmesh with Petsc support
- Beautiful Sequence
- JS任务栏滚动效果问题
- 操作系统-UNIX三级索引技术
- mysql2000清除挂起工具,安装SQL提示挂起操作解决方法
- PaaS建设有什么意义,能够给企业带来哪些价值?
- C 语言绝对值函数abs实现技巧
- 经典力学(动力学)——动量守恒定律与能量守恒定律
- C#键盘事件处理(来源网上)
- linux设置steam为中文,Linux下Steam中支持中文的办法
热门文章
- matlab:双或三方演化博弈,lotka-Volterra 1.双方演化博弈:代分析稳定点分析,代绘制相位图,matlab仿真图代码
- 天刀霸王枪服务器怎么维护了,霸王枪27日合服 11批天涯合服维护公告
- 判断听云是否正常嵌入及注意事项
- 2022中国汽车品牌魅力指数排名:广汽传祺、吉利、东风风行、荣威位居自主品牌前列 | 美通社头条...
- Dubbo 自定义异常,你是怎么处理的?
- python因子分析案例_因子分析及python实现(一)
- 电脑取消撤销快捷键是什么_都知道“撤消”快捷键是Ctrl Z,那“反撤消”是什么呢?...
- 数据结构 排序 思考题 3
- Feescale K60开发笔记3: Tftpd32的使用
- hotmail手机端_hotmail邮箱登陆手机版 参见http://help.