Golang中如何遍历嵌套的interface{}类型列表?
报错原因
你的代码中k的元素类型是interface{},所以遍历得到的outer变量静态类型是interface{}。reflect.TypeOf(outer)返回的是变量运行时的动态类型(也就是你看到的[]interface{}),但Go编译器在编译阶段无法确定interface{}底层存储的具体类型,因此不允许直接对interface{}类型的变量执行range遍历操作。
解决方法
你可以通过两种方式实现嵌套接口列表的取值:
1. 类型断言(推荐,性能更高)
如果你明确知道k中存储的所有元素都是[]interface{}类型,直接做类型断言即可:
package main import "fmt" func main() { var i []interface{} var j []interface{} var k []interface{} i = append(i, 1) i = append(i, "Test") j = append(j, 2) j = append(j, "Try") k = append(k, i) k = append(k, j) for _, outer := range k { // 类型断言转换为[]interface{}类型 if outerSlice, ok := outer.([]interface{}); ok { for _, inner := range outerSlice { fmt.Println(inner) } } } }
运行后输出:
1 Test 2 Try
2. 反射遍历(灵活,适合类型不确定场景)
如果你不确定底层存储的类型,或者嵌套层级更深,可以用反射实现通用遍历:
package main import ( "fmt" "reflect" ) func main() { var i []interface{} var j []interface{} var k []interface{} i = append(i, 1) i = append(i, "Test") j = append(j, 2) j = append(j, "Try") k = append(k, i) k = append(k, j) for _, outer := range k { outerVal := reflect.ValueOf(outer) // 判断值是否为切片类型 if outerVal.Kind() == reflect.Slice { for idx := 0; idx < outerVal.Len(); idx++ { inner := outerVal.Index(idx).Interface() fmt.Println(inner) } } } }
内容的提问来源于stack exchange,提问作者codecrazy46
相关产品推荐
相关产品推荐

