在GO中输入接口转换片

在GO中输入接口转换片

我很好奇为什么Go不隐式转换[]T[]interface{}当它将隐式转换Tinterface{}..关于这个转换有什么不平凡的地方吗?

例子:

func foo([]interface{}) { /* do something */ }func main() {
    var a []string = []string{"hello", "world"}
    foo(a)}

go build抱怨

不能在函数参数中使用(类型[]字符串)作为类型[]接口{}

如果我想明确地做同样的事情:b := []interface{}(a)抱怨

无法将(类型[]字符串)转换为类型[]接口{}

因此,每次我需要做这个转换(这似乎是经常出现的),我一直在做这样的事情:

b = make([]interface{}, len(a), len(a))for i := range a {
    b[i] = a[i]}

是否有更好的方法来实现这个,或者标准库函数来帮助这些转换?每次我想要调用一个函数时,编写4行额外的代码,这似乎有点愚蠢,该函数可以接收例如INT或字符串的列表。


冉冉说
浏览 663回答 3
3回答

Qyouu

你错过的是T和interface{}它的值为T内存中有不同的表示形式,因此不能进行琐碎的转换。类型变量T只是它在记忆中的价值。没有关联的类型信息(在Go中,每个变量都有一个在编译时已知的类型,而不是在运行时已知)。它在内存中如下所示:价值阿interface{}持有类型的变量T在内存中表示,如下所示指向类型的指针T价值回到你最初的问题:为什么Go不隐式转换[]T到[]interface{}?转换[]T到[]interface{}将涉及创建一个新的interface {}值,这是一个非平凡的操作,因为内存中的布局是完全不同的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go