This question already has answers here:
Hiding nil values, understanding why golang fails here

(3个答案)


4年前关闭。




有人可以向我解释此go代码吗?
调用此方法时,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())
    }
}

https://play.golang.org/p/iys7U_UMhG

我知道这与我正在处理强制转换为接口(interface)的nil-struct-pointer有关。

但是,如果要返回一个“智能”错误对象,而不仅仅是简单的DoStuff,那么我将如何设计该接口(interface)error感到困惑。

最佳答案

您走在正确的轨道上。问题是您正在返回指向struct的指针,并且Error方法是使用非指针调用程序实现的。

以下应该工作(我只为*方法的接收者添加了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())
    }
}

关于go - 接口(interface)上的nil测试失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40142806/

10-16 03:44