在go中一个比较大的陷阱就是 nil != nil 这个问题了,那么这个问题到底怎么来的?
看如下的示例代码
```
package main
import (
"reflect"
"log"
)
func see(i interface{}) {
t := reflect.TypeOf(i)
log.Println("类型是:", t)
v := reflect.ValueOf(i)
log.Println("值是:", v)
if i == nil {
log.Println("判断是否Nil:", i == nil)
return
}
log.Println("判断是否Nil:", i == nil)
if t.Kind() == reflect.Ptr {
log.Println("判断值是否Nil:", reflect.ValueOf(i).IsNil())
} else {
log.Println("判断值是否Nil: 非引用类型")
}
log.Println("===========================")
}
type C struct {
}
func main() {
// 传递的是值
see(C{})
// 传递的是引用
see(&C{})
c := &C{}
c = nil
// 传递的是引用,引用的值为Nil
see(c)
see(&c)
//传递一个nil
see(nil)
}
```
```
执行的结果
2018/05/29 10:44:18 类型是: main.C
2018/05/29 10:44:18 值是: {}
2018/05/29 10:44:18 判断是否Nil: false
2018/05/29 10:44:18 判断值是否Nil: 非引用类型
2018/05/29 10:44:18 ===========================
2018/05/29 10:44:18 类型是: *main.C
2018/05/29 10:44:18 值是: &{}
2018/05/29 10:44:18 判断是否Nil: false
2018/05/29 10:44:18 判断值是否Nil: false
2018/05/29 10:44:18 ===========================
2018/05/29 10:44:18 类型是: *main.C
2018/05/29 10:44:18 值是: <nil>
2018/05/29 10:44:18 判断是否Nil: false
2018/05/29 10:44:18 判断值是否Nil: true
2018/05/29 10:44:18 ===========================
2018/05/29 10:44:18 类型是: **main.C
2018/05/29 10:44:18 值是: 0xc042004030
2018/05/29 10:44:18 判断是否Nil: false
2018/05/29 10:44:18 判断值是否Nil: false
2018/05/29 10:44:18 ===========================
2018/05/29 10:44:18 类型是: <nil>
2018/05/29 10:44:18 值是: <invalid reflect.Value>
2018/05/29 10:44:18 判断是否Nil: true
```
这个问题反复就有人谈过了,就是 v != nil
有且仅在 v 的type 和 value 同时都是 nil的时候才成立
因此在把一个&Type 类型的值传递给一个签名为 i interface{} 的函数接收时,一定要小心判断接收到的值的问题
有疑问加站长微信联系(非本文作者)