在 Go 中,[]interface{} 和 []int 是两种不同的类型,虽然它们的底层数据结构都是切片,但是它们的元素类型不同。[]interface{} 是一个空接口切片,可以容纳任意类型的元素,而 []int 是一个整数切片,只能容纳整数类型的元素。
- 错误代码
package main
import (
"fmt"
)
func demo(s []interface{}) {
for _, ele := range s {
fmt.Println(ele)
}
}
func main() {
s1 := []int{1, 2, 3}
demo(s1)
}
- 报错如下:
# command-line-arguments
.\demo.go:14:7: cannot use s1 (variable of type []int) as []interface{} value in argument to demo
在类型系统中,[]interface{} 表示一个空接口切片,可以接受任意类型的值,但这并不意味着它能够自动转换为其他类型的切片。因此,你不能直接将 []int 类型的切片传递给一个接受 []interface{} 类型参数的函数,除非进行显式的类型转换。
要解决这个问题,你需要将 []int 类型的切片转换为 []interface{} 类型的切片,然后再传递给函数。你可以使用循环将 []int 中的每个元素逐个转换为 interface{} 类型并存储到 []interface{} 类型的切片中。
代码如下:
- 使用循环
package main
import (
"fmt"
)
func demo(s []interface{}) {
for _, ele := range s {
fmt.Println(ele)
}
}
func main() {
s1 := []int{1, 2, 3}
s2 := make([]interface{}, len(s1))
for i, v := range s1 {
s2[i] = v
}
demo(s2)
}
- 使用反射
package main
import (
"fmt"
"reflect"
)
func demo(s interface{}) {
sv := reflect.ValueOf(s)
svs := sv.Slice(0, sv.Len())
for i := 0; i < svs.Len(); i++ {
e := svs.Index(i).Interface()
switch e.(type) {
case string:
fmt.Println("string", e)
case int:
fmt.Println("int", e)
}
}
}
func main() {
s1 := []int{1, 2, 3}
demo(s1)
}