分享
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
在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
关注微信2067 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传