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

在GO中输入接口转换片

在GO中输入接口转换片

Go
冉冉说 2019-06-26 16:50:35
在GO中输入接口转换片我很好奇为什么Go不隐式转换[]T到[]interface{}当它将隐式转换T到interface{}..关于这个转换有什么不平凡的地方吗?例子: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或字符串的列表。
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

你错过的是Tinterface{}它的值为T内存中有不同的表示形式,因此不能进行琐碎的转换。

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

  • 价值

interface{}持有类型的变量T在内存中表示,如下所示

  • 指向类型的指针

    T

  • 价值

回到你最初的问题:为什么Go不隐式转换[]T[]interface{}?

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


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 662 浏览
慕课专栏
更多

添加回答

举报

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