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
ibeautiful
相关分类