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

相关文章
|
2月前
|
Java 编译器 Go
Go语言面试题1
【2月更文挑战第5天】Go语言面试题15个问题
56 2
|
25天前
|
负载均衡 算法 Java
【面试宝藏】Go语言运行时机制面试题
探索Go语言运行时,了解goroutine的轻量级并发及GMP模型,包括G(协程)、M(线程)和P(处理器)。GMP调度涉及Work Stealing和Hand Off机制,实现负载均衡。文章还讨论了从协作到基于信号的抢占式调度,以及GC的三色标记算法和写屏障技术。理解这些概念有助于优化Go程序性能。
33 4
|
26天前
|
存储 安全 Java
【面试宝藏】Go基础面试题其一
Go语言(Golang)结合C的性能和Python的易用性,具有简单语法、高效并发、自动垃圾回收等优点。它支持基本和派生数据类型,通过包进行代码管理。类型转换需显式进行,如将整数转为浮点数。Goroutine是轻量级线程,通过channel进行并发同步。Go接口可嵌套,同步锁用于控制并发访问。Channel提供类型安全的通信,注意避免死锁。Go Convey用于测试,`new`和`make`分别用于值类型和引用类型的初始化。了解这些,有助于更好地掌握Go语言。
21 2
|
26天前
|
存储 缓存 算法
【面试宝藏】Go并发编程面试题
探索Go语言并发编程,涉及Mutex、RWMutex、Cond、WaitGroup和原子操作。Mutex有正常和饥饿模式,允许可选自旋优化。RWMutex支持多个读取者并发,写入者独占。Cond提供goroutine间的同步,WaitGroup等待任务完成。原子操作保证多线程环境中的数据完整性,sync.Pool优化对象复用。了解这些,能提升并发性能。
18 2
|
2月前
|
安全 Go 开发者
Golang深入浅出之-Go语言并发编程面试:Goroutine简介与创建
【4月更文挑战第22天】Go语言的Goroutine是其并发模型的核心,是一种轻量级线程,能低成本创建和销毁,支持并发和并行执行。创建Goroutine使用`go`关键字,如`go sayHello("Alice")`。常见问题包括忘记使用`go`关键字、不正确处理通道同步和关闭、以及Goroutine泄漏。解决方法包括确保使用`go`启动函数、在发送完数据后关闭通道、设置Goroutine退出条件。理解并掌握这些能帮助开发者编写高效、安全的并发程序。
37 1
|
2月前
|
Java Go
Golang深入浅出之-Go语言指针面试必知:理解与使用指针
【4月更文挑战第21天】Go语言中的指针允许直接操作内存,常用于高效数据共享和传递。本文介绍了指针的基础知识,如声明、初始化和解引用,以及作为函数参数使用。此外,讨论了`new()`与`make()`的区别和内存逃逸分析。在结构体上下文中,指针用于减少复制开销和直接修改对象。理解指针与内存管理、结构体的关系及常见易错点,对于面试和编写高性能Go代码至关重要。
30 2
|
2月前
|
Java Go 调度
Go语言并发编程原理与实践:面试经验与必备知识点解析
【4月更文挑战第12天】本文分享了Go语言并发编程在面试中的重要性,包括必备知识点和面试经验。核心知识点涵盖Goroutines、Channels、Select、Mutex、Sync包、Context和错误处理。面试策略强调结构化回答、代码示例及实战经历。同时,解析了Goroutine与线程的区别、Channel实现生产者消费者模式、避免死锁的方法以及Context包的作用和应用场景。通过理论与实践的结合,助你成功应对Go并发编程面试。
38 3
|
2月前
|
存储 Go 开发者
Golang深入浅出之-Go语言字符串操作:常见函数与面试示例
【4月更文挑战第20天】Go语言字符串是不可变的字节序列,采用UTF-8编码。本文介绍了字符串基础,如拼接(`+`或`fmt.Sprintf()`)、长度与索引、切片、查找与替换(`strings`包)以及转换与修剪。常见问题包括字符串不可变性、UTF-8编码处理、切片与容量以及查找与替换的边界条件。通过理解和实践这些函数及注意事项,能提升Go语言编程能力。
44 0
|
9月前
|
Go 开发者
Go 语言怎么优化重复的 if err != nil 样板代码?
Go 语言怎么优化重复的 if err != nil 样板代码?
68 0
|
9月前
|
存储 编译器 Go
Go语言隐藏的接口陷阱:nil值判断的各种误区
Go语言隐藏的接口陷阱:nil值判断的各种误区
87 0