1.Sentinel Error 预定义的特定错误 - 不建议

if err == ErrSomething {...}

优点:通过fmt.Errorf携带详细的上下文信息,在错误追踪的时候更高效,并且方便程序员做调试

缺点:它使用起来不够灵活,需要将结果和预先申明的值做对比,因此可能会破坏之前等值判断,可能会成为你公共API的一部分,增加代码的耦合性,并且增加了包与包之间的依赖(容易出现import loop)

2.Error Types 自定义错误类型 - 不建议

优点:能自定义更多详细的报错信息(文件,行号,错误信息等),通过断言可以获取更多的上下文信息

缺点:需要通过断言来获取类型,容易和调用者之间产生强耦合,会成为公共API的一部分

3.Opaque errors 不透明的错误处理 - 建议

优点:不需要关心接口为什么会报错,只需要判断是否产生了错误,耦合性很低,可以通过行为来获取更多的上下文信息(只关心它的行为),提供了公共方法断言,而不需要直接暴露Error