我想问一个关于接口为零的问题//i think err should be a interface (*MyError, nil)var err error = (*MyError)(nil)fmt.Println(reflect.TypeOf(err)) fmt.Println(reflect.ValueOf(err))` 结果告诉我接口值不是 nil 结果:*main.MyError<*main.MyError Value>相当于interface(*main.MyError, <*main.MyError Value>) 为什么interface的值不是nil?
2 回答
MM们
TA贡献1886条经验 获得超2个赞
这两件事是完全不同的:
该
nil
接口值。它不包含基础类型或值。一种非易失
nil
接口值,其中包含基础类型和值,并且该下层值是nil
在该基础类型(如果它是有一个称为值的类型之一nil
-指针,切片,地图,通道或功能)。需要注意的是不同类型的nil
s为不同和不相关(指针-nil
和MAP-nil
无关); 有些类型没有一个叫做值nil
。
你有nil
指针(*MyError
类型),并且赋值给一个接口变量(第一接口类型的error
,然后转换为接口类型interface{}
是的参数类型reflect.TypeOf()
和reflect.ValueOf()
)。因此,这些功能收到未nil
含有基础类型接口值*MyError
与基础值nil
。
reflect.TypeOf(err)
获取基础类型,即*MyError
. 并reflect.ValueOf(err)
构造一个reflect.Value
表示底层类型和值的对象。这就是你所看到的。
所述的字串reflect.Value
产生字符串<T value>
,其中T
是的类型,但它并不试图stringily(该值nil
在这种情况下,指针)。如果您想打印基础值,也许您应该这样做fmt.Println(err)
。
- 2 回答
- 0 关注
- 298 浏览
添加回答
举报
0/150
提交
取消