虽说现在都已经 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.Iserrors.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 类型来处理,可以编译通过,但无法得到想要的结果。
因为 tErrFoo 类型,而 err 实际是 *Foo 类型。
所以我们需要将上边代码第三行,声明 tErr 的位置改为 *Foo 即可。

go1.13 中 errors 包的 Is 与 As 方法相关推荐

  1. anaconda怎么使用python包_Anaconda中python包的介绍与使用方法

    Anaconda中python包的介绍与使用方法 目录: 1.包的定义 2.常用包管理器 3.包管理器的使用方法 4.数据科学常用的包 1.包的定义 由多个和同一功能相关的模块组成,通常为含有_ini ...

  2. 06 Errors For Go1.13

    Errors before For 1.13 最简单的错误检查: if err != nil {// sth went wrong } 有事我们需要对sentinel error进行检查: var E ...

  3. go error接口与errors包详解

    文章目录 错误包需要具有哪些功能? 1. 应该能支持错误堆栈 2. 能够支持不同的打印格式 3. 能支持 Wrap/Unwrap 功能,也就是在已有的错误上,追加一些新的信息 4. 错误包应该有Is方 ...

  4. java中不同包中怎么实例化,Java 笔试题 (01)

    Java 笔试题 1.有1.2.3.4.5个数字,能组成多少个互不相同且无重复数字的四位数?都是多少? 提示:可填在千位.百位.十位.个位的数字都是1.2.3.4.5.组成所有的排列后再去 掉不满足条 ...

  5. Windows中使用包管理器(类似于apt/yum的) - Chocolatey

    Windows中使用包管理器 - Chocolatey简介 李俊才 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_2 ...

  6. 从项目的一个 panic 说起:Go 中 Sync 包的分析应用

    项目开发中遇到一个错误 "fatal error: concurrent map read and map write". 有过一两年 Golang 开发经验的同学应该都不陌生,这 ...

  7. golang中的包管理工具——govendor和godep简单学习

    为什么用vendor目录 依赖问题 我们知道,一个工程稍大一点,通常会依赖各种各样的包.而Go使用统一的GOPATH管理依赖包,且每个包仅保留一个版本.而不同的依赖包由各自的版本工具独立管理,所以当所 ...

  8. 浅析Python中signal包的使用

    原文链接:https://www.jb51.net/article/74844.htm 这篇文章主要介绍了Python中signal包的使用,主要在Linux系统下对进程信号进行相关操作,需要的朋友可 ...

  9. Beetl2.7.13 中文文档

    ## Beetl2.7.13 中文文档 ### 1. 什么是Beetl Beetl目前版本是2.7.13,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使 ...

  10. ubuntu中抓包工具tcpdump使用详解

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

最新文章

  1. 针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言第二部552-556条
  2. Linux下CMake简明教程(七)对库进行链接
  3. PHPCMS v9设置文章的审核功能
  4. VTK:ShareCamera分享相机用法实战
  5. local path of sap-ui-core-less-140903345-dbg.js
  6. centos7 安装cacti
  7. System.Threading.Thread类方法
  8. jq追加元素最前面_DNF:哈林史诗百鬼夜行最理想的首饰搭配,海博伦应选贤者之欲...
  9. [深度学习] 深度学习常见概念
  10. oracle时间去掉时分秒的时间_超详细的oracle修改AWR采样时间间隔和快照保留时间教程...
  11. Building libmesh with Petsc support
  12. Beautiful Sequence
  13. JS任务栏滚动效果问题
  14. 操作系统-UNIX三级索引技术
  15. mysql2000清除挂起工具,安装SQL提示挂起操作解决方法
  16. PaaS建设有什么意义,能够给企业带来哪些价值?
  17. C 语言绝对值函数abs实现技巧
  18. 经典力学(动力学)——动量守恒定律与能量守恒定律
  19. C#键盘事件处理(来源网上)
  20. linux设置steam为中文,Linux下Steam中支持中文的办法

热门文章

  1. matlab:双或三方演化博弈,lotka-Volterra 1.双方演化博弈:代分析稳定点分析,代绘制相位图,matlab仿真图代码
  2. 天刀霸王枪服务器怎么维护了,霸王枪27日合服 11批天涯合服维护公告
  3. 判断听云是否正常嵌入及注意事项
  4. 2022中国汽车品牌魅力指数排名:广汽传祺、吉利、东风风行、荣威位居自主品牌前列 | 美通社头条...
  5. Dubbo 自定义异常,你是怎么处理的?
  6. python因子分析案例_因子分析及python实现(一)
  7. 电脑取消撤销快捷键是什么_都知道“撤消”快捷键是Ctrl Z,那“反撤消”是什么呢?...
  8. 数据结构 排序 思考题 3
  9. Feescale K60开发笔记3: Tftpd32的使用
  10. hotmail手机端_hotmail邮箱登陆手机版 参见http://help.