首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在golang中将接口{}转换为*[]int

在golang中将接口{}转换为*[]int
EN

Stack Overflow用户
提问于 2014-11-03 20:30:49
回答 1查看 3.4K关注 0票数 5

我收到了一个接口,它基本上是一个片段。现在我想把它转换成一个指向切片的指针。问题是,我要么有切片本身,要么有指向接口的指针。我可以很容易地在代码示例中显示:

代码语言:javascript
复制
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{}
}

我需要的是这种类型:

代码语言:javascript
复制
fmt.Println(reflect.TypeOf(result))    // this should be type *[]int

我只知道运行时的类型,因此不能只使用&(model.([]int))

有什么办法用金刚反射来接收这个吗?在这里,类型'int‘实际上并不重要,重要的是,它是一个指向片的指针。*[]interface{}也会没事的。

编辑:

为了更清楚地说明这个问题,我应该补充一句:我对切片的数据不感兴趣,而是只对获取指向同一类型的切片的指针(基本上可以是空的)感兴趣。因此,詹姆斯·亨斯特里奇的回答是完美的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-04 04:03:46

在尝试回答这个问题之前,值得退一步问一下,您所追求的*[]int值应该指向什么?

考虑到method的调用方式,我们不可能从调用上下文中获得指向model变量的指针,因为它将只接收切片的一个副本作为其参数(注意,这是片头的一个副本:支持数组是共享的)。

我们也不能获得指向作为参数传递的副本的指针,因为它是作为一个interface{}变量存储的:接口变量拥有用于存储其动态值的内存,并且在将新值分配给它时可以自由地重用它。如果可以使用指向动态值的指针,则如果分配了不同的类型,则会破坏类型安全性。

如果第三次复制切片,我们可以获得一个*[]int指针,但还不清楚这是否是您想要的:

代码语言:javascript
复制
v := reflect.New(reflect.TypeOf(model))
v.Elem().Set(reflect.ValueOf(model))
result := v.Interface()

这本质上是一种类型不可知论的书写方式:

代码语言:javascript
复制
v := new([]int)
*v = model
var result interface{} = v

现在,如果您真的想要一个指向调用上下文中的切片变量的指针,则需要确保使用指向该切片的指针调用method,并相应地执行相应的操作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26722655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档