Golang的[]interface{}为什么不能接收[]int?

发布于:2024-04-21 ⋅ 阅读:(151) ⋅ 点赞:(0)

在 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)
}


网站公告

今日签到

点亮在社区的每一天
去签到