我收到一个基本上是切片的界面。现在我想将它转换为指向切片的指针。问题是,我有切片本身或指向接口的指针。 我可以在代码示例中轻松显示:
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
我只知道运行时的类型,因此我不能只接受
&(model.([]int))
有没有办法使用golang反射来接收它?类型' int'在这里实际上并不重要,重要的是,它是指向切片的指针。 *[]interface{}
也可以。
编辑:
为了使问题更清楚,我应该补充一点:我对切片的数据不感兴趣,但只是在获取指向相同类型切片的指针(基本上可以为空)。因此James Henstridge完美地回答了问题。
答案 0 :(得分:3)
在尝试回答这个问题之前,有必要退后一步,询问你应该指出的*[]int
值应该指向什么?
考虑到调用method
的方式,我们无法从调用上下文中获取指向model
变量的指针,因为它只接收切片的副本作为其参数(请注意,这是切片标头的副本:共享支持数组。
我们也无法获得指向作为参数传递的副本的指针,因为它存储为interface{}
变量:接口变量拥有用于存储其动态值的内存,并且可以自由使用在为其分配新值时重用它。如果你可以指向动态值,如果指定了不同的类型,这将破坏类型安全性。
如果我们制作切片的第三个副本,我们可以获得*[]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变量的指针,你需要确保调用method
而不是指向切片的指针,并采取相应的行动。