Go中nil比较的隐藏陷阱

 更新时间:2025年09月18日 09:29:53   作者:liushen0528  
Go语言中,nil值比较因类型和上下文而异,相同类型nil相等,不同类型比较报错,下面我们就来介绍一下Go中nil比较的隐藏陷阱,感兴趣的可以了解一下

在Go语言中,两个nil值可能不相等,这一特性往往会让人感到困惑。这是由于Go语言中nil的多重含义和类型系统的工作机制导致的,取决于上下文。

一、不同类型nil的比较

指针、切片、映射等类型的nil值比较规则:当比较相同类型的nil值时(例如两个*int类型的nil指针),它们是相等的。代码示例如下:

func main() {
    var a *int
    var b *int
    fmt.Println(a == b)
}

执行结果如下:

不同类型的 nil 直接比较会导致编译错误,因为其类型不匹配。代码如下:

func main() {
    var ptr *int
    var slice []int
    // 编译错误:类型不匹配
    fmt.Println(ptr == slice)
}

编译结果如下:

与接口类型比较,a类型为*int,值为0;b类型为nil,值为nil,所以a与nil相等,b与nil相等,但是a和b不相等,代码示例如下:

func main() {
    var a *int = nil
    var b interface{} = nil
    fmt.Println("a == nil:", a == nil)
    fmt.Println("b == nil:", b == nil)
    fmt.Println("a == b:", a == b)
}

执行结果如下:

二、接口类型的nil比较

接口变量的比较规则如下:

1)当接口变量的类型和值均为nil时,才被认为与nil相等。

2)若接口变量持有具体类型但值为nil,则与纯nil不相等。

代码示例如下:

func main() {
    var iface interface{} = (*int)(nil)
    fmt.Println(iface == nil)
}

如上代码所示,false类型为*int,值为nil,如果与nil不相等,执行结果如下:

如下代码所示,false类型为nil,值为nil,所以与nil相等,执行结果输出true。

func main() {
    var iface interface{} = nil
    fmt.Println(iface == nil)
}

三、结构体中的nil指针

若结构体包含nil指针字段,需指针指向同一地址才会相等。代码示例如下:

func main() {
    type S struct{ P *int }
    var x, y S
    fmt.Println("x==y :", x == y)
    var z = S{P: new(int)}
    fmt.Println("x==z :", x == z)
}

执行结果如下所示:

四、总结‌

1)不相等的情况

(1)不同类型的 nil 值(如 *int 与 []int 类型)。

(2)接口变量存储 nil 但类型信息非空。

(3)结构体中不同地址的 nil 指针。

2)始终相等的情况‌

(1)相同类型的纯 nil 值(如两个未初始化的 *int 指针)。

到此这篇关于Go中nil比较的隐藏陷阱的文章就介绍到这了,更多相关Go nil比较内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 深入探讨Go语言中的map是否是并发安全以及解决方法

    深入探讨Go语言中的map是否是并发安全以及解决方法

    这篇文章主要来和大家探讨 Go 语言中的 map 是否是并发安全的,并提供三种方案来解决并发问题,文中的示例代码讲解详细,需要的可以参考一下
    2023-05-05
  • GO语言中的Map使用方法详解

    GO语言中的Map使用方法详解

    这篇文章主要给大家介绍了关于GO语言中Map使用方法的相关资料,在go语言中map是散列表的引用,map的类型是map[k]v,也就是常说的k-v键值对,需要的朋友可以参考下
    2023-08-08
  • 一文带你掌握GoLang中的指针

    一文带你掌握GoLang中的指针

    针是 Go 编程语言的重要组成部分,它们提供了一种直接引用和操作内存中数据的方法,在这篇文章中,我们将探讨一些技巧和技巧,以掌握 GoLang 中的指针并编写高效的代码,需要的可以参考一下
    2023-05-05
  • Go语言学习之循环语句使用详解

    Go语言学习之循环语句使用详解

    这篇文章主要为大家介绍了Go语言中的常用循环语句的使用,例如:for循环、for-each、break等,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-04-04
  • Golang 模块引入及表格读写业务快速实现示例

    Golang 模块引入及表格读写业务快速实现示例

    这篇文章主要为大家介绍了Golang模块引入及表格读写业务的快速实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 一起聊聊Go语言中的语法糖的使用

    一起聊聊Go语言中的语法糖的使用

    语法糖通常是用来简化代码编写的,特性就是使用语法糖前后编译的结果是相同的。这篇文章主要就来和大家一起聊聊Go语言中的语法糖的实现
    2022-07-07
  • Go语言使用goroutine及通道实现并发详解

    Go语言使用goroutine及通道实现并发详解

    这篇文章主要为大家介绍了Go语言使用goroutine及通道实现并发详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 用go写的五子棋预测算法的实现

    用go写的五子棋预测算法的实现

    这篇文章主要介绍了用go写的五子棋预测算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • GoLang RabbitMQ实现六种工作模式示例

    GoLang RabbitMQ实现六种工作模式示例

    这篇文章主要介绍了GoLang RabbitMQ实现六种工作模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Golang 中实现 Set的思路详解

    Golang 中实现 Set的思路详解

    本文介绍了Go中两种set的实现原理,并在此基础介绍了对应于它们的两个包简单使用,本文介绍的非常详细,需要的朋友参考下吧
    2024-01-01

最新评论