开始以为 golang 自定义的error 类似父类概念,赋值给error 类型指针 ,指针== nil 判断一定是true。结果意外踩坑。
如下代码示例:
import (
"errors"
"fmt"
"os"
)
type MyErr struct {
Msg string
}
func (c *MyErr) Error() string {
return fmt.Sprintf("some error: %v", c.Msg)
}
func NewError(msg string) *MyErr {
return &MyErr{Msg: msg}
}
func main() {
var mErr *MyErr
fmt.Println("mErr 没有赋值,mErr == nil ,", mErr == nil)
var err error
fmt.Println("err 没有赋值,err == nil:", err == nil)
err = mErr
fmt.Println("err = mErr, err == nil:", err == nil)
asRet := errors.As(mErr, &err)
fmt.Println("errors.As(mErr, &err), err == nil:", err == nil, ",asRet:", asRet)
var mErr2 *MyErr
asRet = errors.As(err, &mErr2)
fmt.Println("errors.As(err, &mErr2), mErr2 == nil:", mErr2 == nil, ",asRet:", asRet)
var pathError *os.PathError
asRet = errors.As(err, &pathError)
fmt.Println("errors.As(err, &pathError), pathError == nil:", pathError == nil, ",asRet:", asRet)
mErr = NewError("一些错误信息")
fmt.Println("mErr已赋值,mErr == nil ,", mErr == nil)
asRet = errors.As(mErr, &err)
fmt.Println("mErr已赋值,errors.As(mErr, &err), err == nil:", err == nil, ",asRet:", asRet)
err = mErr
fmt.Println("mErr已赋值,err = mErr, err == nil:", err == nil)
//var mErr2 *MyErr
var mErr3 *MyErr
asRet = errors.As(err, &mErr3)
fmt.Println("mErr已赋值,errors.As(err, &mErr3), mErr2 == nil:", mErr3 == nil, ",asRet:", asRet)
var pathError2 *os.PathError
asRet = errors.As(err, &pathError2)
fmt.Println("mErr已赋值,errors.As(err, &pathError2), pathError2 == nil:", pathError2 == nil, ",asRet:", asRet)
}
返回值:
mErr 没有赋值,mErr == nil , true
err 没有赋值,err == nil: true
err = mErr, err == nil: false
errors.As(mErr, &err), err == nil: false ,asRet: true
errors.As(err, &mErr2), mErr2 == nil: true ,asRet: true
errors.As(err, &pathError), pathError == nil: true ,asRet: false
mErr已赋值,mErr == nil , false
mErr已赋值,errors.As(mErr, &err), err == nil: false ,asRet: true
mErr已赋值,err = mErr, err == nil: false
mErr已赋值,errors.As(err, &mErr3), mErr2 == nil: false ,asRet: true
mErr已赋值,errors.As(err, &pathError2), pathError2 == nil: true ,asRet: false
自定义错误指针:var mErr *MyErr 赋值给 var err error
mErr == nil, 结果是 true
而 err == nil, 结果false, 因为类型不是error类型。(这个就是遇到的坑)
如下,可以使用 errors.As来安全转换,是否为某个类型的错误
var pathError2 *os.PathError
asRet = errors.As(err, &pathError2)
fmt.Println("mErr已赋值,errors.As(err, &pathError2), pathError2 == nil:", pathError2 == nil, ",asRet:", asRet)
mErr已赋值,errors.As(err, &pathError2), pathError2 == nil: true ,asRet: false