调试需要,要获得某个包中非导出结构体的值,大概是这样:
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 。有什么黑科技可以用吗?
1
xiaoyiyu 327 天前
使用 unsafe 转换,定义一个结构一样的结构体
p := (*MyStruct)(unsafe.Pointer(entry)) |
2
rekulas 327 天前
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 了 |