1 回答

TA貢獻1805條經驗 獲得超10個贊
長話短說;博士; reflect.TypeOf((*error)(nil)).Elem()
是一個表達式,用于獲取reflect.Type
接口類型的類型描述符error
。usingreflect.TypeOf(error(nil))
不能用于相同的目的(閱讀下面的原因)。
reflect.TypeOf((*error)(nil)).Elem()
通過使用nil
type 的類型化指針值實現其目標*error
,將其傳遞給reflect.TypeOf()
以獲取reflect.Type
type 的描述符*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
.
這是使用指向接口的指針有意義且實際上不可避免的罕見情況之一。
- 1 回答
- 0 關注
- 141 瀏覽
添加回答
舉報