V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Ainokiseki
V2EX  ›  Go 编程语言

如何获取 value 为非导出结构体指针的 interface 的真实值

  •  
  •   Ainokiseki · 343 天前 · 1021 次点击
    这是一个创建于 343 天前的主题,其中的信息可能已经有所发展或是发生改变。

    调试需要,要获得某个包中非导出结构体的值,大概是这样:

    package third
    
    type entry struct{
        Value atomic.Value
    }
    

    这个 Value 中储存的是另一个非导出结构体的指针 *third.anotherEntry

    package third
    
    type anotherEntry struct{
        Key ExportStruct //某个导出的结构体
    }
    

    楼主用强制转换大法,搞到了 Value 的值,但问题是 Value.Load()是个 interface ,不能通过类型断言转换成*third.anotherEntry,尝试用反射:

    reflect.ValueOf(Value.Load()).Elem().Field(0).Interface()
    

    但反射也无法获得非导出结构体的 interface ,会直接 panic 。有什么黑科技可以用吗?

    2 条回复    2024-01-10 21:51:26 +08:00
    xiaoyiyu
        1
    xiaoyiyu  
       343 天前
    使用 unsafe 转换,定义一个结构一样的结构体
    p := (*MyStruct)(unsafe.Pointer(entry))
    rekulas
        2
    rekulas  
       343 天前
    atomic.Value 内部是一个 v any 所以直接通过 v 获取也是可以的(当然调 load 应该也可以)
    可以试试如下
    假设 e := &entry{}
    v := reflect.ValueOf(e).Elem().FieldByName("Value")
    s1 := reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem()
    result := reflect.Indirect(s1.FieldByName("v").Elem()).FieldByName("Key") // 因为你说的是指针所以要用 Indirect 转换一下
    不出意外的话就能拿到 ExportStruct 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2543 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.