猿问

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

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()


慕容森
浏览 93回答 1
1回答

繁星点点滴滴

断续器;&nbsp;是用于获取反射的表达式。接口类型的类型描述符。不能将使用用于相同目的(请阅读下面的原因)。reflect.TypeOf((*error)(nil)).Elem()errorreflect.TypeOf(error(nil))reflect.TypeOf((*error)(nil)).Elem()通过使用类型的类型化指针值来实现其目标,将其传递给 以获取类型的描述符,并使用 获取元素(基)类型的类型描述符,即 。nil*errorreflect.TypeOf()reflect.Type*errorType.Elem()*errorerror反映。类型Of()&nbsp;需要一个值:interface{}func&nbsp;TypeOf(i&nbsp;interface{})&nbsp;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?隐藏零值,理解为什么戈朗在这里失败
随时随地看视频慕课网APP

相关分类

Go
我要回答