2014-06-27 94 views
2

我使用Go编程语言进行编程。如何将接口{}转换为[] int?

假设有一个包含整数数组的interface{}变量。如何将interface{}转换回[]int

我已经试过

interface_variable.([]int) 

我得到的错误是:

panic: interface conversion: interface is []interface {}, not []int 
+2

你能否包括代码? (ps:[] int不是整数数组,它是整数的一部分)。 –

+0

您需要使用范围迭代接口{}的切片,并将断言的整数复制到新切片中。 – elithrar

+0

向我们展示您尝试过的方式,以便我们帮助您解决问题。 –

回答

7

这是一个[]interface{}不只是一个interface{},你通过它必须循环,并将其转换:

http://play.golang.org/p/R441h4fVMw

func main() { 
    a := []interface{}{1, 2, 3, 4, 5} 
    b := make([]int, len(a)) 
    for i := range a { 
     b[i] = a[i].(int) 
    } 
    fmt.Println(a, b) 
} 
+0

当我做了'range a',编译器说你不能迭代[] interface {} – user3534472

+0

你有什么版本的go?键入'go version',它工作正常http://play.golang.org/p/R441h4fVMw – OneOfOne

2

正如其他人所说,你应该迭代切片并逐个转换对象。 是更好地使用范围内式开关,以避免恐慌:

a := []interface{}{1, 2, 3, 4, 5} 
b := make([]int, len(a)) 
for i, value := range a { 
    switch typedValue := value.(type) { 
    case int: 
     b[i] = typedValue 
     break 
    default: 
     fmt.Println("Not an int: ", value) 
    } 
} 
fmt.Println(a, b) 

http://play.golang.org/p/Kbs3rbu2Rw

+0

不必要的开销,如果你知道它总是一个'[] int',也应该是'fmt.Println(“不是int:“,value)'。 – OneOfOne

+1

如果您知道它将始终是int的一部分,那么无需从一片界面开始{}。在进行转换或处理类型断言时,测试项目是否是您期望的类型之一始终是最佳做法。我会编辑代码,感谢您指出错字。 – rvignacio

0

Func键返回值是接口{},但实际收益值是[]接口{},那么试试这个相反:

func main() { 
    values := returnValue.([]interface{}) 
    for i := range values { 
     fmt.Println(values[i]) 
    } 
}