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操作就可以了。
那就定义一个函数,函数的接收参数就是这个切片就行了,但是切片类型太多了,你要根据不同的切片类型,写不同从接收参数类型,但是函数体的代码都是一样,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)
}
Golang 传递任意类型的切片的更多相关文章
- [Android]Activity跳转传递任意类型的数据、Activity为SingleTask时代替StartActivityForResult的解决方案
		以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4389674.html 需求:在ActivityA跳转到Acti ... 
- 学习Golang语言(6):类型--切片
		学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ... 
- Golang 的 `[]interface{}` 类型
		Golang 的 []interface{} 类型 我其实不太喜欢使用 Go 语言的 interface{} 类型,一般情况下我宁愿多写几个函数:XxxInt, XxxFloat, XxxString ... 
- 【Python】向函数传递任意数量的实参
		传递任意数量的实参 有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参 def get_letter(*letters): for i in lette ... 
- golang 函数作为类型
		golang 函数作为类型 package main import "fmt" type A func(int, int) func (f A)Serve() { fmt.Prin ... 
- RapidJSON 代码剖析(一):混合任意类型的堆栈
		大家好,这个专栏会分析 RapidJSON (中文使用手册)中一些有趣的 C++ 代码,希望对读者有所裨益. C++ 语法解说 我们先来看一行代码(document.h): bool StartArr ... 
- Android基于mAppWidget实现手绘地图(十三)–如何显示/隐藏任意类型的地图对象
		这个很简单,想要显示或隐藏任意类型的地图对象,首先要对地图对象进行分类.不同类型的地图对象放置到不同的地图图层上,然后控制地图图层的显示/隐藏即可. 实例: Layer sportsLayer = m ... 
- Android java传递int类型数组给C
		接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ... 
- Android java传递string类型数据给C
		本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ... 
随机推荐
- Java——获取网页内容并在本地生成HTML文件
			使用java.net包下的URL类,可以将一个网页(链接)封装成一个URL对象. URL对象有一个openStream()方法,使用该方法可以获取该网页的输入流,我们可以通过读取输入流的方式获得网页的 ... 
- 数据接口-免费版(股票数据API)
			获取股票数据的源头主要有:数据超市.雅虎.新浪.Google.和讯.搜狐.ChinaStockWebService.东方财富客户端.证券之星.网易财经. 数据超市 2016年5月6日更新.根据最近频繁 ... 
- [技术博客]使用PanResponder实现响应左右滑动手势
			在实现用户左右滑动完成不同操作时,使用react-native的官方API--PanResponder响应用户手势操作. PanResponder介绍 PanResponder中文文档 PanResp ... 
- centos7安装yum
			由于不小心把自带的yum给卸载了,卸载命令:rpm -qa yum: 在浏览器打开链接:http://mirrors.163.com/centos/6/os/x86_64/Packages/下载这四个 ... 
- 一个按权重(weight)进行LB的算法
			package netty; import com.google.common.collect.ImmutableList; import lombok.SneakyThrows; import ja ... 
- Proj.4 升级新版本5.x和6.x
			目录 Proj.4 升级新版本5.x和6.x 0.缘起 1.5.x和6.x更新情况简述 PROJ 5.x 更新 PROJ 6.x 更新 2.从PROJ.4向新版本迁移 迁移到5.x版本 迁移到6.x版 ... 
- LiveCD 修复Grub引导
			/usr/sbin/grub-probe: error: failed to get canonical path of /cow 如果你是从这句报错search过来的,恭喜您!看来你也是一个调皮的孩 ... 
- Spring生态研习【五】:Springboot中bean的条件注入
			在springboot中,开发的确变的简单了很多,但是,开发者现在希望开发傻瓜式的方便搞定项目中的各种奇怪的需求最好了,不用烧脑,本来程序猿的生活就是枯燥的,不要再给自己添加更多的烦恼. 今天,就为了 ... 
- revit 碰撞检测相关
			Revit二次开发:由房间获取房间的墙 之前用的方法是由房间边界构成的Solid,计算与该Solid相交的Element,然后判断是否为墙.相对来说这个方法比较通用,可以检索出房间的楼板.窗户 ... 
- Centos7安装完成后设定基本的网络配置
			Centos7设定网络 新安装的centos7,网络默认是不启动的,需要人为的手工修改配置文件,在这里把这个过程简要的记录一下. 设定ip地址与mac地址自定义 [root@web ~]# cd /e ... 
