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

时间:2014-11-03 20:30:49

标签: reflection go slice

我收到一个基本上是切片的界面。现在我想将它转换为指向切片的指针。问题是,我有切片本身或指向接口的指针。 我可以在代码示例中轻松显示:

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完美地回答了问题。

1 个答案:

答案 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而不是指向切片的指针,并采取相应的行动。