作者回复: 21讲已经覆盖的函数的基本语法,这一讲延展到函数设计之错误处理
作者回复: "是因为它们是在最外层的宇宙代码块里面声明的吗" - 是的。 这些预定义的类型由编译器特殊处理。
作者回复: 目前真的没有。
作者回复: 上生产的代码务必不要忽略错误。
作者回复: 👍。
作者回复: 问题再具体一些:)
作者回复: 对,&e是pointer e的地址。因为var err = &MyError{"MyError error demo"}中,err是一个MyError类型的指针,Error方法是*MyError类型的。 As函数要求,第二个参数应该是实现了error接口的类型的指针。这里*MyError实现了error接口,于是As的第二个参数应该是**MyError类型。 当然这个例子也可以改写一下: package main import ( "errors" "fmt" ) type MyError struct { e string } func (e MyError) Error() string { return e.e } func main() { var err = MyError{"MyError error demo"} err1 := fmt.Errorf("wrap err: %w", err) err2 := fmt.Errorf("wrap err1: %w", err1) var e MyError if errors.As(err2, &e) { println("MyError is on the chain of err2") println(e == err) return } println("MyError is not on the chain of err2") } 这样就不用传**MyError了,传*MyError了。因为新版中MyError也实现了error接口。
作者回复: 👍
作者回复: 从机制上说:策略二是通过值比较进行判定,策略三是通过类型比较进行判定。 从功能上说:“基于 Go 标准库提供的错误值构造方法构造的“哨兵”错误值,除了让错误处理方可以“有的放矢”的进行值比较之外,并没有提供其他有效的错误上下文信息。那如果遇到错误处理方需要错误值提供更多的“错误上下文”的情况,上面这些错误处理策略和错误值构造方式都无法满足。”
作者回复: 见仁见智:)