登录
首页 >  Golang >  Go问答

内存布局意味着 []T 在 Go 中无法转换为 []interface 怎么办?

来源:Golang技术栈

时间:2023-04-08 10:08:43 500浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《内存布局意味着 []T 在 Go 中无法转换为 []interface 怎么办?》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

所以我一直在阅读这两篇文章和这个答案

[无法将 []string 转换为 []interface {}](https://stackoverflow.com/questions/12990338/cannot-convert-string-to- interface)表示需要更改内存布局。

[http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in- go](http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in- go)说理解底层内存可以很容易地回答这个问题,并且

http://research.swtch.com/interfaces解释了幕后发生的事情。

但是对于我的生活,我想不出一个原因,就接口的实现而言,为什么 []T 不能转换为 []interface。

所以为什么?

正确答案

文章“ InterfaceSlice ”尝试详细说明:

具有类型的变量[]interface{}不是接口!它是一个元素类型恰好是 的切片interface{}。但即便如此,人们可能会说意思很清楚。

嗯,是吗?具有类型的变量具有[]interface{}特定的内存布局,在编译时已知。

每个都interface{}占用两个词(一个词表示所包含内容的类型,另一个词表示包含的数据或指向它的指针)。因此,长度为 N 且类型[]interface{}为的切片由 N*2 个字长的数据块支持。

另请参阅“ golang中的含义是什么interface{}? ”

2 个字

这与支持具有类型[]MyType和相同长度的切片的数据块不同。它的数据块将是N*sizeof(MyType)单词长。

结果是您无法快速将某些类型分配给[]MyType类型[]interface{}。他们背后的数据看起来不同。

为什么[]string不能[]interface{}在 Go中转换成”补充了一个很好的说明:

// imagine this is possible
var sliceOfInterface = []interface{}(sliceOfStrings)
// since it's array of interface{} now - we can do anything
// let's put integer into the first position
sliceOfInterface[0] = 1
// sliceOfStrings still points to the same array, and now "one" is replaced by 1
fmt.Println(strings.ToUpper(sliceOfStrings[0])) // BANG!

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>