reflection - 在 golang 中将 interface{} 转换为 *[]int

标签 reflection go slice

我收到一个基本上是 slice 的接口(interface)。现在我想将它转换为指向 slice 的指针。问题是,我要么有 slice 本身,要么有一个指向接口(interface)的指针。 我可以在代码示例中轻松展示:

func main(){
    model := []int{1,2,3,4,5,6,7,8,10,11,133123123123}
    method(model)
}

func method(model interface{}){ 
    fmt.Println(reflect.TypeOf(model))    // this is of type []int
    fmt.Println(reflect.TypeOf(&model))   // this is of type *interface{}
}

我需要的是这个类型:

fmt.Println(reflect.TypeOf(result))    // this should be type *[]int

我只在运行时知道类型,因此我不能只接受 &(模型.([]int))

有没有办法使用 golang 反射来接收这个?这里的“int”类型实际上并不重要,重要的是,它是一个指向 slice 的指针*[]interface{} 也可以。

编辑:
为了使问题更清楚,我应该添加:我对 slice 的数据不感兴趣,而只对获取指向相同类型的 slice (基本上可以为空)的指针感兴趣。因此 James Henstridge 的回答非常有效。

最佳答案

在试图回答这个问题之前,有必要退后一步,问问您所追求的 *[]int 值应该指向什么?

鉴于 method 的调用方式,我们不可能从调用上下文中获取指向 model 变量的指针,因为它只会接收 slice 的副本作为其参数(请注意,这是 slice header 的副本:支持数组是共享的)。

我们也无法获得指向作为参数传递的副本的指针,因为它存储为 interface{} 变量:接口(interface)变量拥有用于存储其动态值的内存,并且当为其分配新值时,可以自由重用它。如果您可以获取指向动态值的指针,那么如果分配了不同的类型,这将破坏类型安全。

如果我们制作 slice 的第三个副本,我们可以获得一个 *[]int 指针,但不清楚这是否是您一定想要的:

v := reflect.New(reflect.TypeOf(model))
v.Elem().Set(reflect.ValueOf(model))
result := v.Interface()

这本质上是一种与类型无关的写法:

v := new([]int)
*v = model
var result interface{} = v

现在,如果您真的想要在调用上下文中指向 slice 变量的指针,则需要确保使用指向 slice 的指针调用方法,并采取相应的行动。

关于reflection - 在 golang 中将 interface{} 转换为 *[]int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26722655/

相关文章:

scala - 为什么嵌套实例化中没有可用的 TypeTag(当由 Scala 代码运行器解释时)?

php - 为什么 Memcache::get() 的反射与文档不同?

javascript - 在 golang 中实现响应式模板

python - 在 Pandas 的杂草中使用切片器进行多重索引

java - Reflection Method.getParameterTypes() - 对象参数数组

java - 如何通过类引用访问静态方法

go - 大图书馆围棋中的 Lychrel Numbers

go - 尝试在电子表格上执行 BatchUpdate 请求时获取 'Undefined: sheets.DeleteSheet'

python - 为什么切片和范围上限是排他的?

go - 为什么每次运行程序时 math/rand 包中的 rand.Intn() 函数都会生成相同的随机数序列?