Go
jub*_*0bs 5
如果我正确理解了这个问题,您确实可以简化事情:
a将和定义b为包级error变量,以简化和提高性能。除非您需要以编程方式访问只能在您包装的错误上下文中访问的值,否则您很可能不需要声明这些自定义类型WrapA和WrapB错误类型。相反,您可以简单地使用动词%wwithfmt.Errorf来生成一个包含较低级别错误的新错误值。然后,您可以errors.Is在无标记中使用switch来检查函数返回的更高级别错误的原因doStuff。(游乐场)
package mainimport ( "errors" "fmt")var ( a = errors.New("a") b = errors.New("b"))func doStuff() error { err := a if err != nil { return fmt.Errorf("%w", err) } err = b if err != nil { return fmt.Errorf("%w", err) } return nil}func main() { fmt.Println("Hello, playground") switch err := doStuff(); { case errors.Is(err, a): fmt.Println("error from doing a") case errors.Is(err, b): fmt.Println("error from doing b") case err == nil: fmt.Println("nil") default: fmt.Println("unknown") }} 这是 fmt 包中的相关代码,供任何想知道 cs.opensource.google/go/go/+/refs/tags/go1.17:src/fmt/errors.go;l=32 的人使用 (2认同)