pointers - 从 reflect.Value 中提取 uintptr

标签 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 是指向结构的指针,我需要将其转换为 uintptr

到目前为止我发现了一些事情:(*reflect.Value).InterfaceData() 的第二个成员将是指向该结构的指针,如果它是一个结构的话。如果它不是结构,我不知道它是什么。

最佳答案

使用 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。例如,如果接口(interface) i 包含一个 int,那么 v.Kind()reflect.Int,而不是reflect.Interface.

如果v有接口(interface)值,则通过接口(interface)向下钻取得到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

关于pointers - 从 reflect.Value 中提取 uintptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42621848/

相关文章:

c++ - 我可以使用 C++ 中的指针分配特定的内存地址吗?

amazon-web-services - 为什么使用 `aws-sdk-go-v2` 时看不到 dynamodb 本地容器中的表?

go - 拆分后如何将数组转换为嵌套的json对象

java - 如何引用接口(interface)在 Java 中实现的类类型?

pointers - crossbeam_epoch::Shared::as_raw由 “Converts the pointer to a raw pointer (without the tag)”表示什么?

c - 我对 C 中按值复制/按引用复制的理解是否正确?

c - 结构数组和 sizeof

heroku - Golang, Heroku - 如何检查请求是否为 https

java - .Net 和 Java 接口(interface)是否足够相似,可以以某种方式进行整合?

c++ - 一遍又一遍传递对象的替代方法