Golang 传递任意类型的切片
程序员文章站
2022-04-12 11:19:24
肯定有这样的一种场景,写一个函数,该函数可以接收任意类型的切片,完成相应的功能。 就好比这种情况 还有很多类型的切片,但是我对这些切片的使用,只是for循环每一个元素,执行Print操作就可以了。 那就定义一个函数,函数的接收参数就是这个切片就行了,但是切片类型太多了,你要根据不同的切片类型,写不同 ......
肯定有这样的一种场景,写一个函数,该函数可以接收任意类型的切片,完成相应的功能。
就好比这种情况
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循环操作
直接贴代码,我是参考别人的
该博主的博客: 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,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) }
上一篇: 善用镜面反射技巧手机也能拍大片
下一篇: 拍摄情侣照or婚纱照如何摆姿最自然?
推荐阅读
-
前后端传递参数类型的转换
-
Python新手学习基础之数据类型——字符串的切片截取 博客分类: Python python切片截取索引分割步长
-
C语言实现带头结点的单链表(可以储存任意数据类型)
-
C++ stringstream:实现任意数据类型之间的转换
-
关于Boolean类型在flex与java中间传递的问题 博客分类: Flex/BlazeDS booleanflexjavamapping
-
String类型传递是值传递,char[]类型传递是引用传递的实现
-
golang sql绑定变量_记录一个golang的nil类型有意思的case
-
[Golang] 指针类型和非指针类型的一个比较有意思的案例
-
String类型传递是值传递,char[]类型传递是引用传递的实现
-
动态指定任意类型的ObjectDataSource对象的查询参数