为了账号安全,请及时绑定邮箱和手机立即绑定

反映了什么。类型为(*错误)(无))。埃勒姆()'的意思?

反映了什么。类型为(*错误)(无))。埃勒姆()'的意思?

Go
慕容森 2022-09-26 15:30:45
func (s *service) registerMethods() {    s.method = make(map[string]*methodType)    for i := 0; i < s.typ.NumMethod(); i++ {        method := s.typ.Method(i)        mType := method.Type        if mType.NumIn() != 3 || mType.NumOut() != 1 {            continue        }        if mType.Out(0) != reflect.TypeOf((*error)(nil)).Elem() {            continue        }        argType, replyType := mType.In(1), mType.In(2)        if !isExportedOrBuiltinType(argType) || !isExportedOrBuiltinType(replyType) {            continue        }        s.method[method.Name] = &methodType{            method:    method,            ArgType:   argType,            ReplyType: replyType,        }        log.Printf("rpc server: register %s.%s\n", s.name, method.Name)    }}此代码中的含义是什么?我知道正在尝试确定该方法的返回类型是否是错误的而不是错误。但对我来说,会凭直觉做同样的事情,但不幸的是没有。当我尝试编译此代码时,它说类型错误不是表达式,它在此上下文中意味着什么?不接受某种类型的参数?我发现 (*错误)(无) 等效于 *错误 = 无。我对上述上下文中的这种表达感到困惑。reflect.TypeOf((*error)(nil)).Elem()if mType.Out(0) != reflect.TypeOf((*error)(nil)).Elem()reflect.TypeOf((error)(nil))reflect.Typeof()
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

断续器; 是用于获取反射的表达式接口类型的类型描述符。不能将使用用于相同目的(请阅读下面的原因)。reflect.TypeOf((*error)(nil)).Elem()errorreflect.TypeOf(error(nil))


reflect.TypeOf((*error)(nil)).Elem()通过使用类型的类型化指针值来实现其目标,将其传递给 以获取类型的描述符,并使用 获取元素(基)类型的类型描述符,即 。nil*errorreflect.TypeOf()reflect.Type*errorType.Elem()*errorerror

反映。类型Of() 需要一个值:interface{}

func TypeOf(i interface{}) Type

基本上,无论你传递给什么值,如果它还不是接口值,它将被隐式地包装在。如果传递的值已经是接口值,则存储在其中的具体值将作为 传递为 。reflect.TypeOf()interface{}interface{}

因此,如果您尝试将值传递给它,因为 是接口类型,则存储在其中的具体值将被“重新打包”为值。接口类型错误将不会被保留/转移!errorerrorinterface{}

如果传递一个类型的值,例如,由于接口值本身是 ,它不包含具体的值和类型,因此将传递一个值,这将导致返回。引用自:nilerrorerror(nil)nilnilinterface{}nilreflect.Typereflect.TypeOf()

类型Of 返回表示 i 的动态类型的反射类型,如果 i 是 nil 接口值,则类型Of 返回 nil。

如果传递类型的值(可能是指针),则它不是接口值,而是指针值(指向接口的指针)。因此,它将包装在一个值中,并且存储在其中的具体值将是类型 。使用,您可以访问指向的类型,即 。*errornilinterface{}*errorType.Elem()error

这是使用指向接口的指针有意义的罕见情况之一,实际上是不可避免的。

查看相关问题:

获取反射。基于基元类型的类型

反射有什么区别。ValueOf() 和 Value.Elem() 在 go?

隐藏零值,理解为什么戈朗在这里失败


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信