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

为什么满足错误接口的结构体的 nil 实例比较不等于 nil?

Susan Sarandon
发布: 2024-10-31 07:50:30
原创
854 人浏览过

Why does a nil instance of a struct that satisfies the error interface not compare equal to nil?

Nil Nil 接口比较难题

尽管满足错误接口,但具有 nil 实例的结构体不会表现出来与 nil 相比,符合预期。

问题:

为什么以下代码不输出“Error is 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) // expect "Error is not nil"
}</code>
登录后复制

答案:

在 Go 中,接口比较同时考虑类型和值。虽然 Goof 类型实现了 error 接口,但 Goof (*Goof)(nil) 的 nil 实例具有与以下不同的类型: error(nil).

解决方案:

要解决此问题,您可以采用以下方法之一:

  • 声明 err 错误而不是 var g *Goof。这会将 err 初始化为错误类型的零值,即 nil
  • 在返回错误的函数中,显式返回 nil 而不是隐式返回。

更多详细信息,请参阅下面的扩展响应:

扩展响应:

接口值由两个部分组成:类型和动态值。 nil 接口值同时包含 nil 类型和 nil 值。在我们的例子中, (*Goof)(nil) 具有非 nil 类型 (Goof),但具有 nil 值。

此外,Go 的相等运算符 (==) 严格检查类型标识。因此,将 (*Goof)(nil) 与 error(nil) 进行比较会失败,因为它们的类型不同。

此行为与 Go 中的其他类型检查一致。例如,在下面的代码中,底层数据相同(3),但变量类型不同,导致接口存储时不相等:

<code class="go">var x int = 3
var y Bob = 3
var ix, iy interface{} = x, y
fmt.Println(ix == iy) // false</code>
登录后复制

以上是为什么满足错误接口的结构体的 nil 实例比较不等于 nil?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!