1 回答

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()
通過使用nil
type 的類型化指針值實(shí)現(xiàn)其目標(biāo)*error
,將其傳遞給reflect.TypeOf()
以獲取reflect.Type
type 的描述符*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í)際上不可避免的罕見情況之一。
- 1 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報(bào)