gpt4 book ai didi

pointers - reflect.Pointer() 返回值不是值地址

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:19 25 4
gpt4 key购买 nike

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?为什么不是 *TableMetareflect 的文档说,

Pointer returns v's value as a uintptr. It returns uintptr instead of unsafe.Pointer so that code using reflect cannot obtain unsafe.Pointers without importing the unsafe package explicitly. It panics if v's Kind is not Chan, Func, Map, Ptr, Slice, or UnsafePointer.

在我看来:

info := &BookInfo{}
val := reflect.ValueOf(info)
ptr := val.Pointer()
meta := (*TableMeta)(unsafe.Pointer(val.Pointer()))

应该可以,但实际上当我调用 val.Pointer() 时,返回值是 *TableMeta 的指针(**TableMeta).

最佳答案

您拥有的值是指向 BookInfo 结构的指针,它的类型为 *BookInfo。而 BookInfo.Meta 字段的类型也是一个指针,它是 *TableMeta 类型,因此可以查看 *BookInfo作为 **TableMeta,因此是“双”指针。

结构指针确实指向它的第一个字段,但不要在其上构建。很脆弱。如果你在它之前添加一个字段,它会严重崩溃(这只会在运行时发生,由于包 unsafe 而没有编译时消息)。

因此,如果该值是 *BookInfo 类型,只需从 reflect.Value 包装器中获取它,然后您就可以像 value 一样引用它的字段.Meta,类型为 *TableMeta。避免使用包 unsafe,尤其是在不需要时。

关于pointers - reflect.Pointer() 返回值不是值地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com