V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Ainokiseki

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

  •  
  •   Ainokiseki · Jan 10, 2024 · 1712 views
    This topic created in 843 days ago, the information mentioned may be changed or developed.

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

    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 replies    2024-01-10 21:51:26 +08:00
    xiaoyiyu
        1
    xiaoyiyu  
       Jan 10, 2024
    使用 unsafe 转换,定义一个结构一样的结构体
    p := (*MyStruct)(unsafe.Pointer(entry))
    rekulas
        2
    rekulas  
       Jan 10, 2024
    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 了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2598 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:10 · PVG 22:10 · LAX 07:10 · JFK 10:10
    ♥ Do have faith in what you're doing.