关于nil != nil 的问题

mortemnh · · 1283 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

在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{} 的函数接收时,一定要小心判断接收到的值的问题

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1283 次点击  
加入收藏 微博
2 回复  |  直到 2018-05-29 11:45:58
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传