Go接口是(type,nil)或(type,value)

时间:2014-08-14 05:17:32

标签: interface go

您好,我想问一个关于界面的问题是nil

//i think err should be a interface (*MyError, nil)
var err error = (*MyError)(nil)
fmt.Println(reflect.TypeOf(err)) 
fmt.Println(reflect.ValueOf(err))` 

结果告诉我界面值不是零 结果:

*main.MyError
<*main.MyError Value>

它等同于接口(*main.MyError, <*main.MyError Value>) 为什么界面值不是nil?

感谢

2 个答案:

答案 0 :(得分:2)

这两件事完全不同:

  • nil接口值。它不包含基础类型或值。

  • nil接口值,它包含基础类型和值,并且该基础类型中的基础值为nil(如果它是具有值的类型之一)调用nil - 指针,切片,地图,通道或函数)。请注意,不同类型的“nil”不同且不相关(指针 - nil和地图 - nil无关);某些类型没有名为nil的值。

您有nil指针(*MyError类型),并将其分配给接口变量(接口类型error中的第一个,然后转换为接口类型interface{}这是reflect.TypeOf()reflect.ValueOf())的参数类型。因此,这些函数会收到一个非nil接口值,其中包含基础类型*MyError和基础值nil

reflect.TypeOf(err)获取基础类型,即*MyErrorreflect.ValueOf(err)构造一个表示基础类型和值的reflect.Value对象。这就是你所看到的。

stringification of a reflect.Value生成字符串<T value>,其中T是类型,但在这种情况下它不会尝试用值(nil指针)。如果您想打印基础值,也许您应该刚刚完成fmt.Println(err)

答案 1 :(得分:0)

http://golang.org/pkg/reflect/#ValueOf

  

ValueOf返回一个初始化为存储的具体值的新Value   在接口i。 ValueOf(nil)返回零值。