Go 语言的 nil 能比较自己吗

nil 是什么?

可以看看官方的描述,在 buildin/buildin.go 里:

// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type

nil 是一个预先声明的标识符,代表指针、通道、函数、接口、哈希表或切片的零值。

OK,回到问题,nil 能比较自己吗?

package main

import "fmt"

func main() {
    fmt.Println(nil == nil)
}

// # command-line-arguments
// ./main.go:6:18: invalid operation: nil == nil (operator == not defined on nil)

没有具体的类型,编译器懵逼了说没办法比较。

slice 什么时候是 nil ?

看看下面的代码:

var slice = []string{}
fmt.Println(slice == nil) // false

type GoSlice struct {
        ptr unsafe.Pointer
    len int
    cap int
}
s := (*GoSlice)(unsafe.Pointer(&a))
s.ptr = nil
fmt.Println(s == nil) // true

神奇,切片底层指针为 nil 的时候,就是一个 nil 切片。map、channel、func 也是类似的。

nil 和 interface 一起使用的坑

继续看代码:

type A interface {}
type a struct {}

func Foo() A {
    var data *a // nil
    return data
}

fmt.Println(Foo() == nil) // false

嗯,坑得体无完肤。很反人类!接口为 nil,必须是类型和值同时为 nil,才能等于 nil,无聊的知识又增加了:)


文章来源于本人博客,发布于 2019-06-16,原文链接:https://imlht.com/archives/190/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例...
    天唯阅读 54,143评论 8 77
  • Go入门 Go介绍 部落图鉴之Go:爹好还这么努力? 环境配置 安装 下载源码编译安装 下载相应平台的安装包安装 ...
    齐天大圣李圣杰阅读 10,077评论 0 26
  • [TOC] go语言的31个坑 资源来自于如下链接: http://devs.cloudimmunity.com/...
    阿兵云原生阅读 5,766评论 0 3
  • 本文来自正在规划的Go语言&云原生自我提升系列[https://alanhou.org/go-cloudnativ...
    AlanHou阅读 2,622评论 0 2
  • 目录 通过反射获取类型信息[https://www.cnblogs.com/itbsl/p/10551880.ht...
    gurlan阅读 3,663评论 0 0