从reflect.Value中提取uintptr

时间:2017-03-06 09:25:28

标签: pointers go interface casting

鉴于

// 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 = ???
}
  1. 在这种情况下,我需要一些方法来区分指针和值。
  2. 如果i是指向struct的指针,我需要将其强制转换为uintptr
  3. 到目前为止我发现的东西:(*reflect.Value).InterfaceData()的第二个成员将是结构的指针,以防它是一个结构。如果它不是结构,我不知道它是什么。

1 个答案:

答案 0 :(得分:0)

使用Pointer方法将结构的地址作为uintpr:

var p uintptr
if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct {
    p = v.Pointer()
}

playground example

此代码假定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()
}

playground example