Golang 传递任意类型的切片
肯定有这样的一种场景,写一个函数,该函数可以接收任意类型的切片,完成相应的功能。 就好比这种情况 intSlice := []int{1,2,3,4,5,6,7,8} strSlice := []string{"a","b","c","d"} boolSlice := []bool{true,true,false,true} 还有很多类型的切片,但是我对这些切片的使用,只是for循环每一个元素,执行Print操作就可以了。
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。所以这样是不行的。 下面是解决方法:
直接贴代码,我是参考别人的 该博主的博客: https://blog.csdn.net/HaoDaWang/article/details/83931629 // 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,8} strSlice := []string{"a","d"} boolSlice := []bool{true,true} faa(intSlice) faa(strSlice) faa(boolSlice) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |