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()返回一個值**TableMeta?為什么不呢*TableMeta?文件reflect說,指針將 v 的值作為 uintptr 返回。它返回 uintptr 而不是 unsafe.Pointer,這樣使用 reflect 的代碼就無法在不顯式導入 unsafe 包的情況下獲得 unsafe.Pointers。如果 v 的 Kind 不是 Chan、Func、Map、Ptr、Slice 或 UnsafePointer,它會恐慌。在我腦海里:info := &BookInfo{}val := reflect.ValueOf(info)ptr := val.Pointer()meta := (*TableMeta)(unsafe.Pointer(val.Pointer()))應該可以,但實際上當我調用 時,返回值是( )val.Pointer()的指針。*TableMeta**TableMeta
1 回答

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