Go 接口上的无测试失败

Go 接口上的无测试失败,go,error-handling,null,Go,Error Handling,Null,有人能给我解释一下这个密码吗? 调用此命令时,err!=nil返回true,从而导致一个nil指针引用 type E struct{} func (e E) Error() string { return "" } func DoStuff() *E { return nil } func main() { var err *E err = DoStuff() log.Println(err) // nil testErr(err) } f

有人能给我解释一下这个密码吗?
调用此命令时,
err!=nil
返回true,从而导致一个nil指针引用

type E struct{}

func (e E) Error() string {
    return ""
}

func DoStuff() *E {
    return nil
}

func main() {
    var err *E
    err = DoStuff()
    log.Println(err) // nil
    testErr(err)
}

func testErr(err error) {
    if err != nil {
        log.Println("got error", err.Error())
    }
}

我知道这与我正在处理一个铸造到接口的nil结构指针有关


然而,如果想要返回一个“智能”错误对象,而不仅仅是简单的
错误
,我不知道如何设计这个接口。问题是,您正在返回指向struct的指针,并且您的
Error
方法是使用非指针调用方实现的

以下方法应该有效(我只为
错误的接收器添加了
*

package main

import "log"

type E struct{}

func (e *E) Error() string {
    return ""
}

func DoStuff() *E {
    return nil
}

func main() {
    var err *E
    err = DoStuff()
    log.Println(err) // nil
    testErr(err)
}

func testErr(err error) {
    if err != nil {
        log.Println("got error", err.Error())
    }
}

虽然这不会崩溃,但它仍然会回显“Get error”——即使传递的错误值实际上为零?