您好,我想问一个关于界面的问题是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?
感谢
答案 0 :(得分:2)
这两件事完全不同:
nil
接口值。它不包含基础类型或值。
非nil
接口值,它包含基础类型和值,并且该基础类型中的基础值为nil
(如果它是具有值的类型之一)调用nil
- 指针,切片,地图,通道或函数)。请注意,不同类型的“nil
”不同且不相关(指针 - nil
和地图 - nil
无关);某些类型没有名为nil
的值。
您有nil
指针(*MyError
类型),并将其分配给接口变量(接口类型error
中的第一个,然后转换为接口类型interface{}
这是reflect.TypeOf()
和reflect.ValueOf()
)的参数类型。因此,这些函数会收到一个非nil
接口值,其中包含基础类型*MyError
和基础值nil
。
reflect.TypeOf(err)
获取基础类型,即*MyError
。 reflect.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)返回零值。