type BookInfo struct { Meta *TableMeta ...}func (si *schemaInfo) getTabInfo(obj interface{}) (*tabInfo, error) { typ := reflect.TypeOf(obj) val := reflect.ValueOf(obj) if typ.Kind() != reflect.Ptr { return nil, errors.New("nborm.schemaInfo.getDBInfo() error: required a pointer") } meta := *(**TableMeta)(unsafe.Pointer(val.Pointer())) ... }getTabInfo()效果很好,但我想知道為什么val.Pointer()返回一個(gè)值**TableMeta?為什么不呢*TableMeta?文件reflect說(shuō),指針將 v 的值作為 uintptr 返回。它返回 uintptr 而不是 unsafe.Pointer,這樣使用 reflect 的代碼就無(wú)法在不顯式導(dǎo)入 unsafe 包的情況下獲得 unsafe.Pointers。如果 v 的 Kind 不是 Chan、Func、Map、Ptr、Slice 或 UnsafePointer,它會(huì)恐慌。在我腦海里:info := &BookInfo{}val := reflect.ValueOf(info)ptr := val.Pointer()meta := (*TableMeta)(unsafe.Pointer(val.Pointer()))應(yīng)該可以,但實(shí)際上當(dāng)我調(diào)用 時(shí),返回值是( )val.Pointer()的指針。*TableMeta**TableMeta
1 回答

ibeautiful
TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
您擁有的值是指向結(jié)構(gòu)的指針BookInfo
,它的類(lèi)型為*BookInfo
. 并且字段的類(lèi)型BookInfo.Meta
也是一個(gè)指針,它是類(lèi)型*TableMeta
,因此*BookInfo
可以將 a 視為**TableMeta
,因此是“雙”指針。
結(jié)構(gòu)指針確實(shí)指向它的第一個(gè)字段,但不要在其上構(gòu)建。很脆弱。如果您在它之前添加一個(gè)字段,它會(huì)嚴(yán)重?fù)p壞(這只會(huì)在運(yùn)行時(shí)發(fā)生,由于 package 而沒(méi)有編譯時(shí)消息unsafe
)。
因此,如果該值是 type *BookInfo
,只需從reflect.Value
包裝器中獲取它,然后您就可以引用它的字段value.Meta
,如 ,這將是 type *TableMeta
。避免使用 package unsafe
,尤其是在不需要的時(shí)候。
- 1 回答
- 0 關(guān)注
- 196 瀏覽
添加回答
舉報(bào)
0/150
提交
取消