1 回答
TA贡献1805条经验 获得超10个赞
长话短说;博士; reflect.TypeOf((*error)(nil)).Elem()是一个表达式,用于获取reflect.Type接口类型的类型描述符error。usingreflect.TypeOf(error(nil)) 不能用于相同的目的(阅读下面的原因)。
reflect.TypeOf((*error)(nil)).Elem()通过使用niltype 的类型化指针值实现其目标*error,将其传递给reflect.TypeOf()以获取reflect.Typetype 的描述符*error,并使用Type.Elem()获取 的元素(基)类型的类型描述符*error,即error。
reflect.TypeOf()期望一个interface{}值:
func TypeOf(i interface{}) Type基本上无论你传递给什么值reflect.TypeOf(),如果它还不是一个接口值,它都会被interface{}隐式地包装起来。如果传递的值已经是一个接口值,那么存储在其中的具体值将作为interface{}.
因此,如果您尝试向它传递一个error值,因为它error是一个接口类型,存储在其中的具体值将被“重新打包”为一个interface{}值。接口类型error不会被保留/转移!
如果你传递一个nil类型的值error,例如error(nil),因为接口值本身是nil,它不包含具体的值和类型,一个nil interface{}值将被传递,这将导致nil reflect.Type返回。引用自reflect.TypeOf():
TypeOf 返回表示 i 的动态类型的反射类型。如果 i 是 nil 接口值,则 TypeOf 返回 nil。
如果你传递一个类型的值*error(可能是一个nil指针),它不是一个接口值,它是一个指针值(一个指向接口的指针)。所以它将被包裹在一个interface{}值中,存储在其中的具体值将是 type *error。使用Type.Elem()您可以访问指向的类型,即error.
这是使用指向接口的指针有意义且实际上不可避免的罕见情况之一。
- 1 回答
- 0 关注
- 248 浏览
添加回答
举报
