指针 接口 与 nil 的判断

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

在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果未遵循这个规则,则会引发panic。 **nil不能赋值给结构体,编译时会报错** ```go package main import "fmt" type Man struct{ Name string } var ( man Man == nil man1 *Man ) func main () { fmt.Println("man == nil is ",man == nil) } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218160042547.png) **结构体不能与nil判断,运行时会报错** ```go package main import "fmt" type Man struct{ Name string } var ( man Man man1 *Man ) func main () { fmt.Println("man == nil is ",man == nil) } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218162258373.png) ## 指针与nil判断 ```go package main import "fmt" type Man struct{ Name string } var ( man Man man1 *Man ) func main () { fmt.Println("man1 == nil is ",man1 == nil) } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020121816394665.png) **注意**:当指针是nil的时候不能调用结构体属性,会报空指针异常 ## 接口nil的判断 ```go package main import ("fmt" "reflect" ) type Person interface { Sex() } type Man struct{ Name string } func (*Man) Sex(){fmt.Println("不知道")} func GetNilPerson() Person{ var man *Man = nil return man } func GetPerson() Person{ var man *Man = &Man{} return man } var ( man Man man1 *Man per Person per1 = GetNilPerson() per2 = GetPerson() ) func main () { fmt.Println("per == nil is",nil == per) fmt.Println("per1 == nil is",nil == per1) fmt.Println("per2 == nil is",nil == per2) } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218165908392.png) **官方对interface的定义** *官方在常见问题中,对interface判断nil进行了描述:* - interface的内部实现,其实有两个很核心的元素,那就是type与value。 - interface == nil,仅当type、value均为nil,即(nil,nil)。很多时候,type有值,而value==nil。 - 实际开发中,不应存在type==nil,value!=nil的情况。 **在面对类型时,可以利用反射包(reflect)的TypeOf获取的Type,再调用Kind来了解基础结构类别** ```go package main import ("fmt" "reflect" ) type Person interface { Sex() } type Man struct{ Name string } func (*Man) Sex(){fmt.Println("不知道")} func GetNilPerson() Person{ var man *Man = nil return man } func GetPerson() Person{ var man *Man = &Man{} return man } var ( man Man man1 *Man per Person per1 = GetNilPerson() per2 = GetPerson() ) func main () { fmt.Println("per == nil is",nil == per) fmt.Println("per1 == nil is",nil == per1) fmt.Println("per2 == nil is",nil == per2) fmt.Printf("per information: nil?:%5v, type=%15v, value=%5v \n", per == nil, reflect.TypeOf(per), reflect.ValueOf(per)) //接口变量,type、value都是nil,所以cat1==nil fmt.Printf("per1 information: nil?:%5v, type=%5v, type.kind=%5v, value=%5v \n", per1 == nil, reflect.TypeOf(per1), reflect.TypeOf(per1).Kind(), reflect.ValueOf(per1)) //接口变量,type!=nil,所以cat2!==nil fmt.Printf("per2 information: nil?:%5v, type=%5v, type.kind=%5v, value=%5v \n", per2 == nil, reflect.TypeOf(per2), reflect.TypeOf(per2).Kind(), reflect.ValueOf(per2)) //接口变量,type!=nil, 所以cat3!=nil } ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201218171026325.png) 当类型和值都为空的时候接口才与nil相等 > 转载:[*https://blog.csdn.net/weixin_45161636/article/details/111374074*]

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

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

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