Type converting slices of interfaces in Go
我很好奇为什么Go没有隐式地将
例子:
1 2 3 4 5 6 | func foo([]interface{}) { /* do something */ } func main() { var a []string = []string{"hello","world"} foo(a) } |
cannot use a (type []string) as type []interface {} in function argument
如果我想明确地做,同样的事情:
cannot convert a (type []string) to type []interface {}
所以每次我需要做这个转换(这看起来是很多),我都在做这样的事情:
1 2 3 4 | b = make([]interface{}, len(a), len(a)) for i := range a { b[i] = a[i] } |
有没有更好的方法可以做到这一点,或者标准库函数可以帮助进行这些转换?每次我想调用一个可以获取一个列表的函数(如int或strings),再多写4行代码似乎有点傻。
在go中,有一个一般规则,语法不应隐藏复杂/昂贵的操作。将
这个规则的一个例外是转换字符串。在将
没有标准的库函数可以为您进行这种转换。您可以使用reflect创建一个,但它将比三行选项慢。
反射示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | func InterfaceSlice(slice interface{}) []interface{} { s := reflect.ValueOf(slice) if s.Kind() != reflect.Slice { panic("InterfaceSlice() given a non-slice type") } ret := make([]interface{}, s.Len()) for i:=0; i<s.Len(); i++ { ret[i] = s.Index(i).Interface() } return ret } |
不过,您最好的选择是使用您在问题中给出的代码行:
1 2 3 4 | b := make([]interface{}, len(a)) for i := range a { b[i] = a[i] } |
您缺少的是拥有
- 价值
拥有
- 指向类型
T 的指针 - 价值
所以回到你原来的问题:为什么不隐含地把
将
官方解释如下:https://github.com/golang/go/wiki/interfaceslice
1 2 3 4 5 | var dataSlice []int = foo() var interfaceSlice []interface{} = make([]interface{}, len(dataSlice)) for i, d := range dataSlice { interfaceSlice[i] = d } |
试试
1 2 3 4 | func foo(bar interface{}) { s := bar.([]string) // ... } |
将接口转换为任何类型
Syntax:
1 | result := interface.(datatype) |
例子:
1 2 | var employee = interface{["Jhon","Arya"]} result := employee.([]string) //result have type of []string. |