知识卡片
Nil接口陷阱
内容
接口等于 nil 只有在动态类型和动态值都为空时成立。一个保存了 *PathError 类型但值为 nil 的 error 并不等于 nil;边界返回错误时要避免把 nil 指针装进接口。
参考来源
- 位置:《Go语言底层原理剖析》第12章《接口与程序设计模式》12.5.9节《接口的陷阱》
- 结论依据:原文用返回 *os.PathError 类型但值为 nil 的 err 为例,说明"当接口为nil时,代表接口中的动态类型和动态类型值都为nil……由于接口error具有动态类型*os.PathError,因此err==nil为false",因此可以推出"接口等于 nil 要求动态类型和动态值同时为空,一个持有具体 nil 指针类型的接口并不等于 nil"的结论。
- 原始内容:接口的第三类陷阱涉及接口与nil之间的关系。在下面的foo函数中,由于返回的err没有任何动态类型和动态值,因此err==nil为true。把foo函数改进成如下形式,我们会发现err==nil为false。原因在于,当接口为nil时,代表接口中的动态类型和动态类型值都为nil……由于接口error具有动态类型*os.PathError,因此err==nil为false。