首页 > 后端开发 > Golang > 正文

为什么 Go 中 `nil` 接口值不等于 `error(nil)`?

Patricia Arquette
发布: 2024-10-30 18:45:30
原创
684 人浏览过

Why Does `nil` Interface Value Not Equal `error(nil)` in Go?

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>
登录后复制

要解决这个问题,有多种方法:

  1. 声明 var err error 而不是 var g *Goof,因为 err 为零value 很方便是 error(nil)。
  2. 如果函数返回错误,使用 return nil 将返回所需的 nil 接口值。

以上是为什么 Go 中 `nil` 接口值不等于 `error(nil)`?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板