接口切片的类型转换

我很好奇为什么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行代码似乎是很愚蠢的。


慕丝7291255
浏览 292回答 3
3回答

杨__羊羊

您所缺少的是,T并且interface{}它T在内存中具有不同的表示形式,因此不能轻易转换。类型变量T就是它在内存中的值。没有关联的类型信息(在Go中,每个变量在编译时而不是运行时都有一个已知的单一类型)。它在内存中的表示方式如下:价值一个interface{}类型的保持变量T在这样存储器表示类型的指针 T价值现在回到您的原始问题:为什么go不会隐式转换[]T为[]interface{}?转换[]T为[]interface{}涉及创建新的interface {}值切片,这是不平凡的操作,因为内存中的布局完全不同。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go