亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
蝴蝶刀刀 2023-05-08 14:31:19
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,尤其是在不需要的時候。


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號