首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >golang (*interface{})( nil )是否为nil?

golang (*interface{})( nil )是否为nil?
EN

Stack Overflow用户
提问于 2017-03-28 10:28:39
回答 1查看 5K关注 0票数 10

代码片段如下:

代码语言:javascript
复制
package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := (*interface{})(nil)
    fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a))
    var b interface{} = (*interface{})(nil)
    fmt.Println(reflect.TypeOf(b), reflect.ValueOf(b))
    fmt.Println(a == nil, b == nil)
}

输出如下:

代码语言:javascript
复制
*interface {} <nil>
*interface {} <nil>
true false

那么var interface{}:=是不同的,为什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-28 10:43:18

根据golang faq的说法

在幕后,接口被实现为两个元素,一个类型和一个值。该值称为接口的动态值,是一个任意的具体值,类型是该值的类型。对于int值3,接口值示意性地包含( int,3)。

仅当内部值和类型都未设置时,接口值才为nil (nil,nil)。具体地说,nil接口将始终保持nil类型。如果我们在接口值中存储一个*int类型的nil指针,那么内部类型将是*int,而不管指针的值是什么:(*int,nil)。因此,即使内部指针为nil,这样的接口值也将为非nil。

a := (*interface{})(nil)等同于var a *interface{} = nil

但是var b interface{} = (*interface{})(nil),mean b的类型是interface{},当它的类型和值都是nil时,interface{}只会变nil,很明显,类型*interface{}不是nil

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43059653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档