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比较内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Golang中Context.WithCancel 的实战指南

    Golang中Context.WithCancel 的实战指南

    本文介绍了Go语言中context包的核心用法,重点讲解了context.Background()和context.WithCancel()的使用场景,具有一定的参考价值,感兴趣的可以了解一下
    2025-11-11
  • Go语言中日期包(time包)的具体使用

    Go语言中日期包(time包)的具体使用

    本文主要介绍了Go语言中日期包的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • GoLang内存泄漏原因排查详解

    GoLang内存泄漏原因排查详解

    内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,简单点说就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出出现out of memory异常
    2022-12-12
  • 利用go语言编写一个并发包

    利用go语言编写一个并发包

    这篇文章主要为大家详细介绍了如何利用go语言编写一个并发包,适合大部分并发任务,开箱即用,文中的示例代码讲解详细,有需要的小伙伴可以参考下
    2023-10-10
  • golang利用unsafe操作未导出变量-Pointer使用详解

    golang利用unsafe操作未导出变量-Pointer使用详解

    这篇文章主要给大家介绍了关于golang利用unsafe操作未导出变量-Pointer使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-08-08
  • golang并发下载多个文件的方法

    golang并发下载多个文件的方法

    今天小编就为大家分享一篇golang并发下载多个文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • GoFrame gmap遍历hashmap listmap treemap使用技巧

    GoFrame gmap遍历hashmap listmap treemap使用技巧

    这篇文章主要为大家介绍了GoFrame gmap遍历hashmap listmap treemap使用技巧的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go实现JWT认证中间件的项目实战

    Go实现JWT认证中间件的项目实战

    本文将介绍在Gin框架中实现完整的JWT认证方案,同时包含灵活的 Redis 集成选项,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • 如何用Go语言操作MySQL示例详解

    如何用Go语言操作MySQL示例详解

    MySQL是业界常用的关系型数据库,这篇文章主要介绍了如何用Go语言操作MySQL的相关资料,文中通过代码介绍的非常详细,对大家学习或者使用go语言操作mysql具有一定的参考借鉴价值,需要的朋友可以参考下
    2025-10-10
  • GoFrame框架数据校验之校验结果Error接口对象

    GoFrame框架数据校验之校验结果Error接口对象

    这篇文章主要为大家介绍了GoFrame框架数据校验之校验结果Error接口对象示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论