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

Leo*_*Tao 6 go

代码段如下:

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)
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

*interface {} <nil>
*interface {} <nil>
true false
Run Code Online (Sandbox Code Playgroud)

所以var interface{}不同:=,为什么?

zzn*_*zzn 14

根据golang faq

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

仅当内部值和类型都未设置(nil,nil)时,接口值才为nil.特别是,nil接口将始终保持nil类型.如果我们在接口值中存储类型为*int的nil指针,则无论指针的值如何,内部类型都将是*int:(*int,nil).因此,即使内部指针为零,这样的接口值也将是非零的.

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

但是var b interface{} = (*interface{})(nil),mean b是type interface{},interface{}只有nil当它的类型和值都是变量时才变量nil,显然类型*interface{}不是nil.