情景
当我们希望把一个接口断言为切片的时候,直接断言为切片内的元素类型会报错
解决办法
正确的做法是:先断言为切片接口,然后遍历切片接口,再断言为其他类型
举例
package main
import (
"fmt"
)
func main() {
var v interface{}
a := []interface{}{"1", "2"}
v = a // v 这时还是interface{} 但其实是个 []interface{}
newValue := v.([]string)
fmt.Println(newValue)
}
例子中,v为一个接口,我们知道这个接口为字符串切片,然后我们希望断言为[]string
但是会报错
panic: interface conversion: interface {} is []interface {}, not []string [recovered]
panic: interface conversion: interface {} is []interface {}, not []string
提示我们不能直接换成
[]string
所以我们先转化为[]interface{}
package main
import (
"fmt"
)
func main() {
var v interface{}
a := []interface{}{"1", "2"}
v = a // v 这时还是interface{} 但其实是个 []interface{}
newValue := v.([]interface{})
fmt.Println(newValue)
}
//可以正常打印
// [1 50]
我们试图将 []interface{}
转化为[]string
package main
import (
"fmt"
)
func main() {
var v interface{}
a := []interface{}{"1", "2"}
v = a // v 这时还是interface{} 但其实是个 []interface{}
newValue := v.([]interface{})
s:=newValue.([]string)
fmt.Println(newValue)
}
提示
invalid operation: newValue (variable of type []interface{}) is not an interface
这里告诉我们只有接口类型的才可以进行断言所以这种方式是错误的
由于切片类型间不能互相直接转化所以需要展开遍历,然后对interface{}
进行断言
package main
import (
"fmt"
)
func main() {
var v interface{}
a := []interface{}{"1", "2"}
v = a // v 这时还是interface{} 但其实是个 []interface{}
newValue := v.([]interface{})
for _, i := range newValue {
fmt.Println(i.(string))
}
}
/*
可以正常打印
1
2
*/
到此成功转化完成
总结
- interface{} 就算是个切片类型也不能直接遍历,需要先转化
- 切片之间不能互相转化
- 接口类型的才可以进行断言