接口上的nil测试失败

时间:2016-10-19 22:54:51

标签: 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)
}

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

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

我已经明白这与我正在处理一个接口到接口的nil-struct-pointer的事实有关...

但是我很困惑如何设计这个接口DoStuff,如果想要返回一个“智能”错误对象,而不仅仅是error

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。事实是你返回指向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())
    }
}