2014-11-03 134 views
2

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

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

http://golang.org/pkg/reflect/#Value.Addr有什么问题?我承认我不明白你真正想做什么。这真的取决于。并非Go **中的所有值都是**可寻址的,因此可能无法做到。你想用* [] int做什么? – Volker 2014-11-03 21:21:34

+0

事实上,这个值是不可寻址的。 基本上我想创建一个预定义类型的片(使用reflect.MakeSlice)并将它传递给mgo的一个方法(mgo的Query的All()方法)。这个方法需要一个Ptr到Slice。我通过在已知类型的外部创建切片来找到解决方案。但我试图找到一种通用的方式来做到这一点。 我理解你是否正确,因为它不是一个可解决的价值,这是不可能的? – Chrisport 2014-11-03 21:36:56

+0

*所有内容都以价值传递。将值复制到'method'调用后,您无法获得指向'model'的指针。无论它是否是'interface {}'都没关系,你有切片值,而不是指针。 – JimB 2014-11-03 22:54:45

回答

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 

现在,如果你真的想要一个指向调用上下文切片变量,您将需要确保method是带一个指针,而不是切片并采取相应行动。

+0

这是一个很好的使用反射包。 – Drew 2014-11-04 05:53:52

+0

谢谢,这个作品完美!我基本上对切片数组的内容不感兴趣(在我的用例中它总是空的),但只是在获得相同类型的切片和指向它的指针。 – Chrisport 2014-11-04 07:46:36