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

347 天前
 Ainokiseki

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

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 。有什么黑科技可以用吗?

1024 次点击
所在节点    Go 编程语言
2 条回复
xiaoyiyu
347 天前
使用 unsafe 转换,定义一个结构一样的结构体
p := (*MyStruct)(unsafe.Pointer(entry))
rekulas
347 天前
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 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1007517

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX