起因是这个:proposal: errors: add With(err, other error) error #52607

这其实在其他有异常的语言里是很常见也很容易实现的一个场景,例如Java的Throwable就可以用构造器进行嵌套,这样可以一层一层的getCause然后instanceof判断类型。

但Go里的fmt.Errorf是无类型的,所以如果要错误嵌套,就必须在各个Error对象上自己实现嵌套的能力,这显然非常的麻烦,而且有些错误是库里的,并不好做这个改动。

但我们回顾下errors包的使用,主要判断方式就是IsAs两个,直接用Unwrap的场景并不多,而且errors包的IsAs方法在实现上也会判断被比较对象是不是实现了这两个方法并返回true,所以自己简单写一个,把多个error给包起来,同时也实现IsAs方法进行逐个比较就完事,50行代码还是很简单的

代码贴在这里:https://gist.github.com/ayanamist/f988de9c073ca7d07a29820621bdaeb3