一尘不染

Golang返回nil不返回nil

go

我创建了一个自定义错误类型来包装错误,以便更轻松地在Golang中进行调试。当有打印错误时它可以工作,但是现在引起了恐慌。

演示版

type Error struct {
    ErrString string
}

func (e *Error) Error() string {
    return e.ErrString
}

func Wrap(err error, str string) *Error {
    if err == nil {
        return nil
    }
    e := &Error{
        ErrString: str + err.Error(),
    }
    return e
}

当我调用一个函数时,它不会返回错误,我仍然应该能够包装该错误。

预期的行为是,如果错误为nil,则应该简单地忽略它,不幸的是,它会做相反的事情。

func foo() error {
    err := bar()
    return Wrap(err, "bar called")
}

func bar() error {
    return nil
}

func main() {
    err := foo()
    if err != nil {
        fmt.Printf("Found error %v\n",err)
        return
    }
    fmt.Println("No Errors")
}

我希望它能打印出来No errors。而是Found error <nil>即使错误为nil也会打印。


阅读 678

收藏
2020-07-02

共1个答案

一尘不染

if err != nil

正在将err变量与nil进行比较error,但实际上它是nil*Error

将代码更改为

err:=foo()
var  nilerror *Error = nil
if err != nilerror {
    fmt.Printf("Found error %v\n",err)
    return
}
fmt.Println("No Errors")

产生预测结果。

2020-07-02