golang 切片 接口_Golang 传递任意类型的切片

本文介绍了如何在Golang中通过空接口`interface{}`和反射技术来创建一个能处理任意类型切片的函数。通过`CreateAnyTypeSlice`函数将传入的切片转换为`[]interface{}`类型,从而实现对不同类型切片的遍历打印。在`main`函数中,分别对`int`、`string`和`bool`类型的切片调用`faa`函数,展示了该方法的有效性。
摘要由CSDN通过智能技术生成

肯定有这样的一种场景,写一个函数,该函数可以接收任意类型的切片,完成相应的功能。

就好比这种情况

intSlice := []int{1,2,3,4,5,6,7,8}

strSlice := []string{"a","b","c","d"}

boolSlice := []bool{true,true,false,true}

还有很多类型的切片,但是我对这些切片的使用,只是for循环每一个元素,执行Print操作就可以了。

那就定义一个函数,函数的接收参数就是这个切片就行了,但是切片类型太多了,你要根据不同的切片类型,写不同从接收参数类型,但是函数体的代码都是一样,for循环,然后Print就可以。那么有没有一种类型,可以接收所有类型的参数呢?

interface{}: 空接口这个类型,他可以接收任意类型的数据

func faa (arg interface{}) {

fmt.Println(arg)

}

func main() {

faa(intSlice)

faa(strSlice)

faa(boolSlice) // 能够成功输出,不会报错

}

但是将faa的函数体改下,执行for操作

func faa (arg interface{}) {

for _,v := range arg {

fmt.Println(v)

}

}

运行程序,会报错,报错信息:cannot range over arg (type interface {}), interface {}类型不能进行for循环,,那么[] interface {}这种切片类型就可以进行for了吧,

func faa (arg []interface{}) {

for _,v := range arg {

fmt.Println(v)

}

}

func main() {

faa(intSlice)

faa(strSlice)

faa(boolSlice)

}

这样的情况的话,我们在调用faa函数的时候,已经报错了,说类型不对,faa的接收参数类型为[]interface{},但我传递的参数类型为[]int,[]string,[]bool。所以这样是不行的。

下面是解决方法:

首先faa接收的参数类型为 interface{}

将arg进行转化,转为[]interface{}

最后进行for循环操作

直接贴代码,我是参考别人的

// interface{}转为 []interface{}

func CreateAnyTypeSlice(slice interface{}) ([]interface{}, bool) {

val, ok := isSlice(slice)

if !ok {

return nil, false

}

sliceLen := val.Len()

out := make([]interface{}, sliceLen)

for i := 0; i < sliceLen; i++ {

out[i] = val.Index(i).Interface()

}

return out, true

}

// 判断是否为slcie数据

func isSlice(arg interface{}) (val reflect.Value, ok bool) {

val = reflect.ValueOf(arg)

if val.Kind() == reflect.Slice {

ok = true

}

return

}

// 看需求写的代码

func faa(arg interface{}) {

slice, ok := CreateAnyTypeSlice(arg)

if !ok {

return

}

for index,value := range slice {

fmt.Println(index,value)

}

}

func main() {

intSlice := []int{1,2,3,4,5,6,7,8}

strSlice := []string{"a","b","c","d"}

boolSlice := []bool{true,true,false,true}

faa(intSlice)

faa(strSlice)

faa(boolSlice)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值