Chr*_*ort 4 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{}
}
Run Code Online (Sandbox Code Playgroud)
我需要的是这种类型:
fmt.Println(reflect.TypeOf(result)) // this should be type *[]int
Run Code Online (Sandbox Code Playgroud)
我只在运行时知道类型,因此我不能只接受
&(model.([]int))
有没有办法使用 golang 反射来接收这个?'int' 类型在这里实际上并不重要,重要的是,它是一个指向 slice的指针。*[]interface{}
也没关系。
编辑:
为了使问题更清楚,我应该补充说:我对切片的数据不感兴趣,而只对获取指向相同类型切片的指针(基本上可以为空)感兴趣。因此,James Henstridge 的回答非常有效。
在尝试回答这个问题之前,有必要退后一步并询问*[]int
您所追求的价值应该指向什么?
鉴于method
被调用的方式,我们不可能model
从调用上下文中获得指向变量的指针,因为它只会接收切片的副本作为其参数(请注意,这是切片头的副本:支持数组是共享)。
我们也无法获得指向作为参数传递的副本的指针,因为它存储为interface{}
变量:接口变量拥有用于存储其动态值的内存,并且在分配新值时可以自由重用它它。如果您可以使用指向动态值的指针,如果分配了不同的类型,这将破坏类型安全。
*[]int
如果我们制作切片的第三个副本,我们可以获得一个指针,但不清楚这是否是您一定想要的:
v := reflect.New(reflect.TypeOf(model))
v.Elem().Set(reflect.ValueOf(model))
result := v.Interface()
Run Code Online (Sandbox Code Playgroud)
这本质上是一种编写以下内容的类型不可知方式:
v := new([]int)
*v = model
var result interface{} = v
Run Code Online (Sandbox Code Playgroud)
现在,如果您真的想要在调用上下文中指向切片变量的指针,则需要确保method
使用指向切片的指针来调用它并采取相应的行动。