Nil 接口实例的比较
考虑下面的代码:
<code class="go">type Goof struct {} func (goof *Goof) Error() string { return fmt.Sprintf("I'm a goof") } func TestError(err error) { if err == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } } func main() { var g *Goof // nil TestError(g) // Displays "Error is not nil" }</code>
令人惊讶的是,这段代码会产生“ Error is not nil”,尽管我们的目的是测试 nil 条件。
理解这种行为的关键在于 Go 如何实现接口。在内部,接口值由类型和值组成。虽然值可能为零,但类型永远不会为零。在给定的示例中,(*Goof)(nil) 是一个类型为“*Goof”且值为 nil 的接口值。
但是,错误接口类型与“*Goof”类型不同。因此, (*Goof)(nil) 和 error(nil) 不相等,即使它们都包含 nil 值。从下面的代码可以看出这一点:
<code class="go">var g *Goof // nil var e error = g if e == nil { fmt.Println("Error is nil") } else { fmt.Println("Error is not nil") } // Output: Error is not nil</code>
要解决这个问题,有多种方法:
以上是为什么 Go 中 `nil` 接口值不等于 `error(nil)`?的详细内容。更多信息请关注PHP中文网其他相关文章!