亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

reflect.TypeOf((*error)(nil)).Elem()` 是什么意思?

reflect.TypeOf((*error)(nil)).Elem()` 是什么意思?

Go
楊__羊羊 2023-03-07 11:04:25
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))直覺上會做同樣的事情,但不幸的是不會。當我嘗試編譯這段代碼時,它說 type error is not an expression,在這種情況下它是什么意思?不reflect.Typeof()接受某種類型的參數?我發現 (*error)(nil) 等同于 *error = nil。在上面的上下文中,我對這個表達感到困惑。
查看完整描述

1 回答

?
holdtom

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.

這是使用指向接口的指針有意義且實際上不可避免的罕見情況之一。


查看完整回答
反對 回復 2023-03-07
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號