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

时间:2017-03-28 02:28:39

标签: 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)
}

输出如下:

*interface {} <nil>
*interface {} <nil>
true false

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

1 个答案:

答案 0 :(得分:12)

根据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)b类型interface{}interface{}nil变量类型和值均为nil,显然,*interface{}类型不是nil