为什么满足错误接口的结构体的 nil 实例比较不等于 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

本文讨论了GO编程中的GO FMT命令,该命令将代码格式化以遵守官方样式准则。它突出了GO FMT在维持代码一致性,可读性和降低样式辩论方面的重要性。 FO的最佳实践

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...

本文介绍在Debian系统下监控PostgreSQL数据库的多种方法和工具,助您全面掌握数据库性能监控。一、利用PostgreSQL内置监控视图PostgreSQL自身提供多个视图用于监控数据库活动:pg_stat_activity:实时展现数据库活动,包括连接、查询和事务等信息。pg_stat_replication:监控复制状态,尤其适用于流复制集群。pg_stat_database:提供数据库统计信息,例如数据库大小、事务提交/回滚次数等关键指标。二、借助日志分析工具pgBadg
