Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go nil比较

Go中nil比较的隐藏陷阱

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

您可能感兴趣的文章:
阅读全文