首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go接口之nil != nil

一、引出话题: 在开始这个话题之前,我们先看一段代码以及其输出结果,代码如下所示: 从上面的输出结果来看,GetA()返回的类型为*A就算赋值为nil,也不等于nil。...看到这里笔者觉得很奇怪,明明是GetA()返回值是nil,为什么nil的判断条件是false呢?...二、原因分析: 在研究了interface之后,笔者发现了真相,原来Go语言中的interface是不是nil的条件,不单单是interface中的值是nil,类型还需要是nil才行。...,只要有中一个不为nil,那么interface就不是nil。...验证代码如下所示: 通过上面代码的输出,我们能够看到GetA()返回的空接口,type已经被赋值了,就算value还是nil,接口a依然不会是nil

19520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Go 接口:nil接口为什么不等于nil

    Go 接口:nil接口为什么不等于nil? 本文主要内容:深入了解接口类型的运行时表示层。...2.2 “动静皆备”的特性的好处 首先,接口类型变量在程序运行时可以被赋值为不同的动态类型变量,每次赋值后,接口类型变量中存储的动态类型信息都会发生变化,这让 Go 语言可以像动态语言(比如 Python...接口类型的动静特性展示了其强大的一面,然而在日常使用中,对Gopher常常困惑与“nil 的 error 值不等于 nil”。下面我们来详细看一下。 三、nil error 值 !...未显式初始化的接口类型变量的值为nil,也就是这个变量的 _type/tab 和 data 都为 nil。...println("i = nil:", i == nil) println("err = nil:", err == nil) println("i = err:", i == err) } 运行这个函数

    27951

    Go 语言揭秘:接口类型是 nil 但不等于 nil

    : ", b == nil)}func isNil(x any) bool {return x == nil}程序运行结果:isNil: trueisNil: false b == nil: true...此外,还直接打印了 b == nil 的值,用于对比。根据运行结果可知,在 isNil 函数里 a == nil 成立,而 b == nil 不成立,但在外部,b == nil 成立。...只有当接口的 类型部分 和 值部分 都为 nil 时,该接口才被认为是 nil。...反射机制检查 nil既然 == 或 != 这两种方式不能完全判断接口类型是否为 nil,那么该怎么解决这个问题呢?答案是使用 反射。通过反射,我们可以直接判断某个变量值是否为 nil。...只有当 类型部分 和 值部分 都为 nil 时,接口才被认为是 nil。解决方案:使用反射机制可以准确判断一个接口类型变量是否为 nil

    30310

    Go中nil意义的理解

    v=ynoY2xz-F8s,Slides:https://speakerdeck.com/campoy/understanding-nil nil是什么 就结果来说,nil是绝大部分Go中类型的初始值,...对接口来说,接口为nil代表着(nil,nil),因此如果声明了一个自珍并且把指针赋值给了接口,那类型就不为nil了(*Person,nil) type Person struct{ a int }...)//true var p *Person s = p fmt.Println(s == nil)//false,尽管值依旧为nil,但是类型不为nil } 什么时候nil不是nil nil可以是一个...=nil || b!=nil{ select{ case v,ok := <-a: if !...对于管道来说,比较需要注意的是对已经关闭的管道和nil的管道写入和读取等操作时与正常管道的差异。 对于map和其他类型来说,需要注意的是报错,比如nil切片的越界错误和nil映射表的读取错误哦。

    53310

    深入了解Golang的NIL机制

    接下来,顺便总结一下nil的使用 实际运用nil nil 是go语言中预先定义的标识符,不是关键字或保留字。 我们可以直接使用nil,而不用声明它。...而且我们可以定义一个名称为 nil 的变量,比如下面这样: var nil = errors.New("nil") fmt.Printf("%#v\n", nil)//&errors.errorString...默认值nil (重点记住) 在go语言中: 布尔类型的零值(初始值)为 false 数值类型的零值为 0 字符串类型的零值为空字符串"" 除此之外其它类型的默认值为nilnil可以代表下面这些类型的零值...不同类型的nil值占用的内存大小可能是不一样的 一个类型的所有的值的内存布局都是一样的。nil也不例外。nil的大小一致与同类型中的非nil类型的值的大小一样大。...} } 如果类型T的零值是用预先定义的nil来表示的话,*new(T)产生一个nil T类型的值 //如果类型T的零值是用预先定义的nil来表示的话,*new(T)产生一个nil T类型的值 package

    50330

    go语言nil和interface详解

    golang的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。nil是预先说明的标识符,也即通常意义上的关键字。...由于nil是untyped(无类型),而又将nil赋值给了变量val,所以val实际上存储的是(nil, nil)。因此很容易就知道val和nil的相等比较是为true的。...也就是说变量val的底层结构肯定不为(nil, nil),因此它和nil的相等比较总是为false。 上面的讨论都是在围绕值类型来进行的。...关于(*interface{})(nil)还有一些要注意的地方。这里仅仅是拿(*interface{})(nil)来举例,对于(*int)(nil)、(*byte)(nil)等等来说是一样的。...not nil") } } 很显然,无论该指针的值是什么:(*interface{}, nil),这样的接口值总是非nil的,即使在该指针的内部为nil

    98550
    领券