为了账号安全,请及时绑定邮箱和手机立即绑定

接口切片的类型转换

接口切片的类型转换

Go
慕丝7291255 2021-04-30 13:14:51
我很好奇为什么Go不会隐式转换[]T为[]interface{},而Go会隐式转换T为interface{}。我缺少这种转换的重要内容吗?例子:func foo([]interface{}) { /* do something */ }func main() {    var a []string = []string{"hello", "world"}    foo(a)}go build 抱怨不能在函数参数中使用(类型[]字符串)作为类型[] interface {}如果我尝试显式地执行此操作,则会遇到同样的事情:b := []interface{}(a)抱怨无法将(类型[]字符串)转换为类型[] interface {}因此,每次我需要进行这种转换时(这似乎很多),我一直在做这样的事情:b = make([]interface{}, len(a), len(a))for i := range a {    b[i] = a[i]}有没有更好的方法可以做到这一点,或者有标准的库函数来帮助实现这些转换?每次我想调用一个可以接收例如int或字符串列表的函数时,多写4行代码似乎是很愚蠢的。
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您所缺少的是,T并且interface{}T在内存中具有不同的表示形式,因此不能轻易转换。

类型变量T就是它在内存中的值。没有关联的类型信息(在Go中,每个变量在编译时而不是运行时都有一个已知的单一类型)。它在内存中的表示方式如下:

  • 价值

一个interface{}类型的保持变量T在这样存储器表示

  • 类型的指针 T

  • 价值

现在回到您的原始问题:为什么go不会隐式转换[]T[]interface{}

转换[]T[]interface{}涉及创建新的interface {}值切片,这是不平凡的操作,因为内存中的布局完全不同。


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 291 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信