1.error在go语言是什么
- error are value:error是一种值
- error在go语言里是一个接口,里面有一个待实现的Error函数
- error.New()发生了什么?
error包里有一个不导出的errString结构体,实现了Error方法,成为了一个error
这里一个小细节,new方法返回的是结构体的指针,而不是结构体,因为go比较两个结构体是否相等时,是依次比较每个字段,如果不返回结构体指针的话,当字段s相同时就会被认为时同一个错误 - 当函数多个返回参并且有error时,必须先判定err,才能使用返回值,除非你对返回值也不关心,才可以不判定error
- error的设计机制让你立马处理它
2.error的类型
- sentinel error :
预先定义了可能出现的error情况,调用者跟定义好的error作比较 不足:增加了API的表面积,缺少错误的上下文 - error struct 自定义struct记录error的通用信息 不足:这样上下文有了,但是同样存在依赖opal,断言成你的error时,还是必须知道你定义的struct
opaque error:不透明的error,当你只需要知道是否error时,直接return即可,当还需要继续细分,断言行为而不是断言值或类型:
对外暴露错误的行为,调用者传入error去判断即可3.best practice
- 自己new的错误,使用带堆栈信息(如pkg/errors)等包返回,而不是直接fmt
- 项目内调其他函数产生的错误,直接透传(return err)
- 调用标准库或者第三方库产生的error,可以wrap携带更多信息(并且不会破坏错误根因)
- 错误抛给调用者而不是到处打日志,在根处可以记录日志,或者这个错误上层不关心(有兜底方案),则直接记录下日志,不再透传error
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。