我的情况是变量的值"错误"价值只能是" 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)
如何输出最后两行?
答案 0 :(得分:2)
对于要比较等于error
的接口值(如nil
值),实际包含的值和实际包含的类型都必须为nil
。在您的情况下,您有一个接口值,其中包含nil
指针,但*TestError
(即非nil
)类型。
PS。如果不清楚这些“界面值”是什么,您可以查看http://research.swtch.com/interfaces
答案 1 :(得分:0)
在第二种情况下,您将打印作为类型和值的接口实例信息,键入(*main.TestError)
值为(nil)
。在第一种情况下,您实际比较的不是nil
,因为它也是界面。