为什么"错误!= nil"?

时间:2015-07-30 15:57:54

标签: go

我的情况是变量的值"错误"价值只能是" nil"断言"(错误== nil)== false"一旦被重新分配。

以下示例代码:

package main

import (
    "fmt"
    "log"
)

type TestError struct {
    Message string
}

func (e *TestError) Error() string {
    return e.Message
}

func NewTestError(err error) *TestError {
    if err == nil {
            return nil
    }
    log.Printf("NewTestError( ... ): creating new NewTestError err = %s", err)
    return &TestError{Message: err.Error()}
}

func main() {
    var err error
    _, err = fmt.Printf("excuse.\n")
    err = NewTestError(err)
    log.Printf("main( ... ): err == nil. %v", (err == nil))
    log.Printf("main( ... ): err = %#v", err)
}

我从上面的代码中得到以下输出:

excuse.
2015/07/30 08:28:28 main( ... ): err == nil. false
2015/07/30 08:28:28 main( ... ): err = (*main.TestError)(nil)

如何输出最后两行?

2 个答案:

答案 0 :(得分:2)

对于要比较等于error的接口值(如nil值),实际包含的值和实际包含的类型都必须为nil。在您的情况下,您有一个接口值,其中包含nil指针,但*TestError(即非nil)类型。

PS。如果不清楚这些“界面值”是什么,您可以查看http://research.swtch.com/interfaces

答案 1 :(得分:0)

在第二种情况下,您将打印作为类型和值的接口实例信息,键入(*main.TestError)值为(nil)。在第一种情况下,您实际比较的不是nil,因为它也是界面。