我收到了一个接口,它基本上是一个片段。现在我想把它转换成一个指向切片的指针。问题是,我要么有切片本身,要么有指向接口的指针。我可以很容易地在代码示例中显示:
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))
有什么办法用金刚反射来接收这个吗?在这里,类型'int‘实际上并不重要,重要的是,它是一个指向片的指针。*[]interface{}也会没事的。
编辑:
为了更清楚地说明这个问题,我应该补充一句:我对切片的数据不感兴趣,而是只对获取指向同一类型的切片的指针(基本上可以是空的)感兴趣。因此,詹姆斯·亨斯特里奇的回答是完美的。
发布于 2014-11-04 04:03:46
在尝试回答这个问题之前,值得退一步问一下,您所追求的*[]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,并相应地执行相应的操作。
https://stackoverflow.com/questions/26722655
复制相似问题