// I know that behind SomeInterface can hide either int or a pointer to struct
// In the real code I only have v, not i
i := something.(SomeInterface)
v := reflect.ValueOf(i)
var p uintptr
if "i is a pointer to struct" {
p = ???
}
i
是指向struct的指针,我需要将其强制转换为uintptr
。到目前为止我发现的东西:(*reflect.Value).InterfaceData()
的第二个成员将是结构的指针,以防它是一个结构。如果它不是结构,我不知道它是什么。
答案 0 :(得分:0)
使用Pointer方法将结构的地址作为uintpr:
var p uintptr
if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct {
p = v.Pointer()
}
此代码假定v
是调用reflect.ValueOf(i)
的结果,如问题所示。在这种情况下,v
代表i
的元素,而不是i
。例如,如果界面i
包含int
,则v.Kind()
为reflect.Int
,而不是reflect.Interface
。
如果v
有一个接口值,那么深入了解界面以获取uintptr:
if v.Kind() == reflect.Interface {
v = v.Elem()
}
var p uintptr
if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct {
p = v.Pointer()
}