Go中两个Nil可能不相等吗,面试官说回家等通知

简介: Go中两个Nil可能不相等吗,面试官说回家等通知

1. 前言



有人给我们后台留言,说是由于双减政策影响,公司被裁员了,他出去面试经常被怼,说是基础太差,后来经过深入了解发现在大公司呆久了你会变成一个螺丝钉,只会专注自己的那一部分业务,对于基础,新技术早就忘得一干二净,那可不就得处处碰壁吗。我让他随便说了一个问题,哪个问题没有回答好,他说:Go中两个Nil可能不相等吗这个问题没有回答好,面试官直接让他回家等通知去了,这。。。


640.png


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相关的技术原理,最好就是看源码,很清晰。

相关文章
|
4月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
4月前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
4月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
4月前
|
并行计算 数据挖掘 大数据
[go 面试] 并行与并发的区别及应用场景解析
[go 面试] 并行与并发的区别及应用场景解析
|
1月前
|
存储 Rust Go
Go nil 空结构体 空接口有什么区别?
本文介绍了Go语言中的`nil`、空结构体和空接口的区别。`nil`是预定义的零值变量,适用于指针、管道等类型;空结构体大小为0,多个空结构体实例指向同一地址;空接口由`_type`和`data`字段组成,仅当两者均为`nil`时,空接口才为`nil`。
Go nil 空结构体 空接口有什么区别?
|
3月前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
60 10
|
4月前
|
存储 负载均衡 算法
[go 面试] 一致性哈希:数据分片与负载均衡的黄金法则
[go 面试] 一致性哈希:数据分片与负载均衡的黄金法则
|
4月前
|
运维 监控 容灾
[go 面试] 实现服务高可用的策略和实践
[go 面试] 实现服务高可用的策略和实践
|
4月前
|
Go API 数据库
[go 面试] 分布式事务框架选择与实践
[go 面试] 分布式事务框架选择与实践
|
4月前
|
安全 Go 调度
[go 面试] 深入理解并发控制:掌握锁的精髓
[go 面试] 深入理解并发控制:掌握锁的精髓