第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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()正在嘗試確定方法的返回類型是否為錯(cuò)誤。但對(duì)我來說,reflect.TypeOf((error)(nil))直覺上會(huì)做同樣的事情,但不幸的是不會(huì)。當(dāng)我嘗試編譯這段代碼時(shí),它說 type error is not an expression,在這種情況下它是什么意思?不reflect.Typeof()接受某種類型的參數(shù)?我發(fā)現(xiàn) (*error)(nil) 等同于 *error = nil。在上面的上下文中,我對(duì)這個(gè)表達(dá)感到困惑。
查看完整描述

1 回答

?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊

長話短說;博士; reflect.TypeOf((*error)(nil)).Elem()是一個(gè)表達(dá)式,用于獲取reflect.Type接口類型的類型描述符error。usingreflect.TypeOf(error(nil)) 不能用于相同的目的(閱讀下面的原因)。


reflect.TypeOf((*error)(nil)).Elem()通過使用niltype 的類型化指針值實(shí)現(xiàn)其目標(biāo)*error,將其傳遞給reflect.TypeOf()以獲取reflect.Typetype 的描述符*error,并使用Type.Elem()獲取 的元素(基)類型的類型描述符*error,即error。

reflect.TypeOf()期望一個(gè)interface{}值:

func TypeOf(i interface{}) Type

基本上無論你傳遞給什么值reflect.TypeOf(),如果它還不是一個(gè)接口值,它都會(huì)被interface{}隱式地包裝起來。如果傳遞的值已經(jīng)是一個(gè)接口值,那么存儲(chǔ)在其中的具體值將作為interface{}.

因此,如果您嘗試向它傳遞一個(gè)error值,因?yàn)樗?code>error是一個(gè)接口類型,存儲(chǔ)在其中的具體值將被“重新打包”為一個(gè)interface{}值。接口類型error不會(huì)被保留/轉(zhuǎn)移!

如果你傳遞一個(gè)nil類型的值error,例如error(nil),因?yàn)榻涌谥当旧硎?code>nil,它不包含具體的值和類型,一個(gè)nil interface{}值將被傳遞,這將導(dǎo)致nil reflect.Type返回。引用自reflect.TypeOf()

TypeOf 返回表示 i 的動(dòng)態(tài)類型的反射類型。如果 i 是 nil 接口值,則 TypeOf 返回 nil。

如果你傳遞一個(gè)類型的值*error(可能是一個(gè)nil指針),它不是一個(gè)接口值,它是一個(gè)指針值(一個(gè)指向接口的指針)。所以它將被包裹在一個(gè)interface{}值中,存儲(chǔ)在其中的具體值將是 type *error。使用Type.Elem()您可以訪問指向的類型,即error.

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


查看完整回答
反對(duì) 回復(fù) 2023-03-07
  • 1 回答
  • 0 關(guān)注
  • 195 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)