本文是Go比较有名的一个坑,在以前面试的时候也被问过,为什么想起来写这个?
因为我们线上就真实出现过这个坑,写给不了解的人在使用 if err != nil 的时候提高警惕。
Go语言的interface{}在使用过程中有一个特别坑的特性,当你比较一个interface{}类型的值是否是nil的时候,这是需要特别注意避免的问题。
先来看看一个demo:
package main
import "fmt"
type ErrorImpl struct{}
func (e *ErrorImpl) Error() string {
return ""
}
var ei *ErrorImpl
var e error
func ErrorImplFun() error {
return ei
}
func main() {
f := ErrorImplFun()
fmt.Println(f == nil)
}
//输出:
false
为什么不是true?
想要理解这个问题,首先需要理解interface{}变量的本质。在Go语言中,一个interface{}类型的变量包含了2个指针,一个指针指向值的在编译时确定的类型,另外一个指针指向实际的值。
// InterfaceStructure 定义了一个interface{}的内部结构
type InterfaceStructure struct {
pt