空标识符 (_) 是Go中的一个特殊标识符,用于忽略值。在返回的函数值不需要时使用,或者在只为调用其init时导入包,或者在实现接口时使用。
示例:
// 忽略错误返回值 data, _ := ioutil.ReadFile("file.txt") // 仅为了副作用导入包 import _ "net/http/pprof"
此外,空标识符在实现接口时也有帮助,不需要显式使用所有方法:
var _ io.Reader = (*MyReader)(nil) // 如果类型不实现接口,则编译将失败
是否可以使用空标识符永久性地抑制错误?这是一种安全的做法吗?
回答: 不可以。虽然空标识符允许忽略错误,但这并不是一种安全的做法——抑制错误往往会导致致命的错误或程序的不正确运行。始终应有意识地处理错误,只有在明确不重要的地方(例如,逻辑上明显不重要的地方)使用空标识符来抑制错误。
故事
在一个文件处理应用中,开发人员在所有地方使用了_, _ = file.Write(...)的结构,忽略了写入错误。结果在磁盘满或写入故障时,程序依然“像一切正常”,导致数据丢失。
故事
在一个审计项目中,审计师认为如果函数返回错误,就总是需要抑制它(_)。因此在测试中未注意到记录操作的错误——重要数据丢失,原因不明。
故事
一名学生在学习Go时,在导入多个第三方包时使用了空标识符,虽然这根本没必要。结果二进制文件的大小几乎增加了两倍,因为所有包的副作用都被包含在最终应用程序中。