前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:值为 nil 为什么不等于 nil ?

面试官:值为 nil 为什么不等于 nil ?

作者头像
小锟哥哥
发布2022-12-05 14:01:30
4890
发布2022-12-05 14:01:30
举报
文章被收录于专栏:GoLang全栈

小明同学去面试被问到了这么一个面试题,请看代码:

代码语言:javascript
复制
var f func()
var a *struct{}

list := []interface{}{f, a}
for _, item := range list {
 if item == nil {
  fmt.Println("nil")
 }
}

请问输出结果是啥?

可能很多同学,会认为结果是输出两个 nil。

为什么呢?

因为 f 和 a 都没初始化,都是 nil,所以循环遍历后肯定也是 nil。

如果你的答案也是这样,那就掉进坑里了。

答案是,啥都不会输出!

且听我慢慢给你分析:

一、变量的值和类型

我们先来打印下这两个值:

代码语言:javascript
复制
var f func()
var a *struct{}
fmt.Println(f, a)

// 输出结果
<nil> <nil>

我们这样打印其实是打印的是他的值,是 nil 没错的。

但是类型不是 nil。

我们可以这样打印他类型:

代码语言:javascript
复制
var f func()
var a *struct{}
fmt.Printf("%T,%T \n", f, a)

// 输出结果
func(),*struct {}

二、if 判 nil 含有对类型的判断

当我们从 interface 里面把对象取出来后,使用 if 进行判断,他不单单的比较的是值,还有类型。

看下这段代码:

代码语言:javascript
复制
var f func()
var a *struct{}

list := []interface{}{f, a, nil}
 for _, item := range list {
  fmt.Println("item=", item)
  fmt.Printf("item type: %T \n", item)
  if item == nil {
   fmt.Println("item == nil")
  }
  fmt.Println("----")
 }
}

现在看下运行结果:

代码语言:javascript
复制
$ go run main.go 
item= <nil>
item type: func() 
----
item= <nil>
item type: *struct {} 
----
item= <nil>
item type: <nil> 
item == nil
----

你会发现之后最后 nil 的判断是通过的,前面两个判断都不通过。

三、怎么判断值是否为 nil

我们在写代码时,最好是尽量避免这种代码,如果硬要这么写,那我们可以通过以下两种常见方式判 nil。

1、断言

代码语言:javascript
复制
list := []interface{}{f, a}
for _, item := range list {
 if v, ok := item.(func()); ok && v == nil {
  fmt.Println("item is nil")
 }
 if v, ok := item.(*struct{}); ok && v == nil {
  fmt.Println("item is nil")
 }
}

2、反射

代码语言:javascript
复制
list := []interface{}{f, a}
for _, item := range list {
 if reflect.ValueOf(item).IsNil() {
  fmt.Println("item is nil")
 }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、变量的值和类型
  • 二、if 判 nil 含有对类型的判断
  • 三、怎么判断值是否为 nil
    • 1、断言
      • 2、反射
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档