1. 前言
有人给我们后台留言,说是由于双减政策影响,公司被裁员了,他出去面试经常被怼,说是基础太差,后来经过深入了解发现在大公司呆久了你会变成一个螺丝钉,只会专注自己的那一部分业务,对于基础,新技术早就忘得一干二净,那可不就得处处碰壁吗。我让他随便说了一个问题,哪个问题没有回答好,他说:Go中两个Nil可能不相等吗
这个问题没有回答好,面试官直接让他回家等通知去了,这。。。
2. Go中两个Nil可能不相等?
猪猪老师很随和,既然粉丝问了这个问题,那就顺便回答一下,这里就把答案贴出来。
首先可以肯定:Go中两个Nil可能不相等
我们这里讨论空接口 interface{}
接口(interface) 内部实现(eface结构体)包含 2 个字段,类型 T(_type)和 值 V(data)。一个接口等于 nil,当且仅当 T 和 V 处于 unset 状态(T=nil,V is unset)。
两个接口值比较时,会先比较 T,再比较 V。接口值与非接口值比较时,会先将非接口值尝试转换为接口值,再比较。
例如:
func main() { var p *int = nil var i interface{} = p fmt.Println(i == p) // true fmt.Println(p == nil) // true fmt.Println(i == nil) // false }
这个例子中,将一个非接口p赋值给接口i,此时,i的内部字段为(T=*int, V=nil),即把p的类型*int赋值给i接口类型T,把p的值(nil)赋值给i接口的V,i与p作比较时,将 p 转换为接口后再比较,因此 i 与 p相等,p 与 nil 比较,是直接比较的V值(因为p不是接口类型,只要不是接口类型,那么就可以直接与nil比较, 当然仅限于引用和指针类型哦)所以 p 与 nil相等。
但是当 i 与nil比较时,会将nil转换为接口(T=nil, V=nil),与i(T=*int, V=nil)比较,结果肯定是不想等,因为T不想等,因此 i != nil。
参考另一篇文章:接口值是否等你nil
3. 小结
其实面试官问这个问题无非就是想了解你对interface的掌握情况,如果你对golang本身的特性和原理都不清楚,那基本上通过面试的概率为0,所以掌握interface相关的技术原理,最好就是看源码,很清晰。