【发布时间】:2012-09-27 01:20:13
【问题描述】:
我很好奇为什么 Go 不将 []T 隐式转换为 []interface{},而将 T 隐式转换为 interface{}。我错过了这种转换是否有一些重要的东西?
例子:
func foo([]interface{}) { /* do something */ }
func main() {
var a []string = []string{"hello", "world"}
foo(a)
}
go build抱怨
不能在函数参数中使用 (type []string) 作为 type []interface {}
如果我尝试明确地这样做,同样的事情:b := []interface{}(a) 抱怨
无法将 (type []string) 转换为 type []interface {}
所以每次我需要进行这种转换(这似乎经常出现)时,我一直在做这样的事情:
b = make([]interface{}, len(a), len(a))
for i := range a {
b[i] = a[i]
}
有没有更好的方法或标准库函数来帮助进行这些转换?每次我想调用一个可以获取例如列表的函数时,多写 4 行代码似乎有点愚蠢。整数或字符串。
【问题讨论】:
-
所以你定义“隐式转换 []T 到 []interface{}”意味着“分配一个新切片并复制所有元素”。这与“将 T 隐式转换为 interface{}”的做法不一致,后者只是将值视为更通用的静态类型的视图;没有任何东西被复制;如果你将它类型断言回类型 T,你仍然会得到同样的东西。
-
并没有考虑太多关于如何实现的细节,只是在更高级别上,能够轻松地将整个列表转换为另一种类型作为一种解决方法会很方便具有泛型类型。
-
多年后,希望出现了:Go Generics 即将推出,而且已经有一个游乐场,您可以在其中看到并尝试它们go2goplay.golang.org(背景:go.dev/blog/generics-next-step)
标签: go go-reflect go-interface