然而Go语言的interface在使用过程中却有一个特别坑的特性,当你比较一个interface类型的值是否是nil的时候,这是需要特别注意避免的问题。以一个使用Redis作为对象数据库的实现为例,函数OpenRedis连接Redis数据库并最终返回一个redisEntityStorage对象的指针。这个就是Go语言少有的几个深坑之一,因为不管OpenRedis函数是否连接Redis成功,都会运行连接成功的逻辑。这段代码的输出如下:所以对于一个interface{}类型的nil变量来说,它的两个指针都是0。这是符合Go语言对nil的标准定义的。在Go语言中,nil是零值,而在Java之类的语言里,null实际上是空指针。以上述的OpenRedis为例,一种方法是先对OpenRedis返回的结果进行非-nil检查,然后再赋值给interface变量,如下所示。

Go语言interface 与 nil 的比较

Go语言interface 与 nil 的比较

Go语言interface 与 nil 的比较