接口断言为切片的问题

情景

当我们希望把一个接口断言为切片的时候,直接断言为切片内的元素类型会报错

解决办法

正确的做法是:先断言为切片接口,然后遍历切片接口,再断言为其他类型

举例

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{} 就算是个切片类型也不能直接遍历,需要先转化
  • 切片之间不能互相转化
  • 接口类型的才可以进行断言
posted @ 2023-02-25 20:03  厚礼蝎  阅读(141)  评论(0编辑  收藏  举报