我很好奇为什么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 {}
值切片,这是不平凡的操作,因为内存中的布局完全不同。
- 3 回答
- 0 关注
- 291 浏览
添加回答
举报
0/150
提交
取消