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

就好比这种情况

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 传递任意类型的切片的更多相关文章

  1. [Android]Activity跳转传递任意类型的数据、Activity为SingleTask时代替StartActivityForResult的解决方案

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4389674.html 需求:在ActivityA跳转到Acti ...

  2. 学习Golang语言(6):类型--切片

    学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ...

  3. Golang 的 `[]interface{}` 类型

    Golang 的 []interface{} 类型 我其实不太喜欢使用 Go 语言的 interface{} 类型,一般情况下我宁愿多写几个函数:XxxInt, XxxFloat, XxxString ...

  4. 【Python】向函数传递任意数量的实参

    传递任意数量的实参 有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参 def get_letter(*letters): for i in lette ...

  5. golang 函数作为类型

    golang 函数作为类型 package main import "fmt" type A func(int, int) func (f A)Serve() { fmt.Prin ...

  6. RapidJSON 代码剖析(一):混合任意类型的堆栈

    大家好,这个专栏会分析 RapidJSON (中文使用手册)中一些有趣的 C++ 代码,希望对读者有所裨益. C++ 语法解说 我们先来看一行代码(document.h): bool StartArr ...

  7. Android基于mAppWidget实现手绘地图(十三)–如何显示/隐藏任意类型的地图对象

    这个很简单,想要显示或隐藏任意类型的地图对象,首先要对地图对象进行分类.不同类型的地图对象放置到不同的地图图层上,然后控制地图图层的显示/隐藏即可. 实例: Layer sportsLayer = m ...

  8. Android java传递int类型数组给C

    接着前面的文章<Android java传递int类型数据给C><Android java传递string类型数据给C>,继续实践 实现public native int[] ...

  9. Android java传递string类型数据给C

    本文接着实现<Android java传递int类型数据给C>的还未实现的方法: public native String sayHelloInC(String s); 先贴一个工具方法, ...

随机推荐

  1. VTK图像遮罩(vtkImageMask)

    #!/usr/bin/env python import vtk reader = vtk.vtkJPEGReader() reader.SetFileName("Pygoscelis ad ...

  2. linux jar/war包 后台运行

    1. 基础版,当前ssh窗口锁定,按CTRL+C打断程序运行:或关闭窗口,程序退出 java -jar flowable-modeler.war 2. 改进版,当前ssh窗口不锁定,窗口关闭时,程序终 ...

  3. Hotspot对象的内存布局

    对象头 class oopDesc { ... private: volatile markOop _mark; union _metadata { Klass* _klass; narrowKlas ...

  4. [Beta阶段]第四次Scrum Meeting

    Scrum Meeting博客目录 [Beta阶段]第四次Scrum Meeting 基本信息 名称 时间 地点 时长 第四次Scrum Meeting 19/05/06 大运村寝室6楼 30min ...

  5. linux 下nc 命令的使用

    linux 下nc 命令的使用 https://blog.51cto.com/samyubw/555247

  6. RocketMQ安装部署

    一.简介RocketMQ RocektMQ是阿里巴巴在2012年开源的一个纯java.分布式.队列模型的第三代消息中间件,不仅在传统高频交易链路有着低延迟的出色表现,在实时计算等大数据领域也有着不错的 ...

  7. promise简单实现

    function isFunction(fn){ return Object.prototype.toString.call(fn) === '[object Function]'; } let ST ...

  8. 在 Windows 中配置Maven

    访问http://maven.apache.org/ 点击左侧的导航栏,Download 跳转到下载maven的页面,往下滚动,看到 Files 处,选择apache-maven-3.3.9-bin- ...

  9. Nginx请求转发

    1.比如说我要将127.0.0.1/topics上的所有请求转发到xxx:xxx/上 修改 sudo vim /etc/nginx/nginx.conf server { listen 80; ser ...

  10. (转载)理解Spatial Transformer Networks

    理解Spatial Transformer Networks 转载于:知乎-SIGAI 书的购买链接 书的勘误,优化,源代码资源 获取全文PDF请查看:理解Spatial Transformer Ne ...