[Golang] 用interface{}实现泛型出现的问题
说明
在做一些实现的时候,碰到了一个棘手的问题,问题是这样的,向一个函数里传入slice和begin,end,返回slice[begin:end]。很明显这是一个实现泛型的问题,但是在做具体实现的时候出现问题。
问题
根据问题,很容易写下如下代码:
func returnSlice([]interface{}, begin, end)[]interface{}{
//...具体实现
}slice := returnSlice([]int{1,2,3,4},1,2) // 报错:类型不匹配
显然上述代码会报类型不匹配的错误,究其原因,是编译器把[]int{1,2,3,4}作为interface{}看待了,而传入的参数类型是[]interface{},所以类型不匹配。
解决方案
需要自己构造一个将interface{}转化为[]interface{}的函数:
//将传入slice的每个元素拿出来interface()化
func ToSlice(arr interface{}) []interface{} {v := reflect.ValueOf(arr)if v.Kind() != reflect.Slice {panic("toslice arr not slice")}l := v.Len()ret := make([]interface{}, l)for i := 0; i < l; i++ {ret[i] = v.Index(i).Interface()}return ret
}
再使用的时候,就可以slice := returnSlice(ToSlice([]int{1,2,3,4}),1,2)
[Golang] 用interface{}实现泛型出现的问题相关推荐
- java实现鸭子类型,Golang的interface及duck typing鸭子类型
Golang的interface及duck typing鸭子类型 "当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子." 意思就是: 一个东西究 ...
- golang语言 []interface{}和interface{}
文章目录 golang语言 []interface{} interface(接口) interface应用场景 interface{} 空接口 []interface{} golang中为什么[]st ...
- GoLang之interface底层系列二(类型断言)
文章目录 GoLang之interface底层系列二(类型断言) 1.抽象类型.具体类型 2.断言的作用类型与目标类型 3.空接口.(具体类型) 4.非空接口.(具体类型) 5.空接口.(非空接口) ...
- Golang 为什么不能直接将任意类型数组赋值给 []interface{}完成泛型操作
想用 []interface{} 类型来接受一个任意类型的数组,从而进行泛型操作时,发现直接赋值会发生错误,导致 panic var dataSlice []int = foo() var inter ...
- golang 1.18 新增泛型 简介
目录 (一)如何对泛型进行输出 (二)如何用泛型约束使用的类型范围 (三)泛型中的接口本身对范型进行约束 (四)泛型中如何操作切片 (五)如何利用泛型实现最大值最小值函数 (六)如何使用Golang泛 ...
- android 集成同一interface不同泛型_Dig101:Go之读懂interface的底层设计
Dig101: dig more, simplified more and know more 今天我们聊聊万物皆可为的接口(interface)底层设计. interface 被定义为一组方法的签名 ...
- android 集成同一interface不同泛型_【Java视频教程】day30-泛型??
泛型 泛型的引入 需求:打印集合中所有字符串的长度: 结论: 再使用集合时,因为集合中可以保存不同类型的数据,保存进入集合后不管什么类型的数据都会自动向上转型为Object类型, 所以实际使用时一般需 ...
- android 集成同一interface不同泛型_C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
- android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
Android的泛型有多坑? 先来看看该问题的场景 将String转换成具体对象时,需要进行的关键点就是获取到对象的类型 // 这里定义了一个泛型R,那运行时如何获取到这个类型呢? // 第一眼看上去 ...
最新文章
- mysql数据库增删改实例_Mysql1:数据库表操作,增删改查举例
- Nature调查 l 中国博士生们的科研围城
- sshd_config中文手册2
- python资料库-Python 操作数据库之 records
- JPEG文件格式简单分析
- 多点认证wi-fi_准备使用Wi-Fi 6:认证将于2019年第三季度启动
- 解决svn:E200030: sqlite[S11]:database disk image is malformed
- moore和mealy_Mealy机和Moore机的比较研究 目录
- 【资讯】全球瞩目!无人驾驶真的来了!
- 跨平台开源通讯组件elastic communication
- linux线程计算,有关Linux进程与线程数目计算的问题
- 【Java】什么是多态?多态的实现机制是什么?
- 如何测试java定时器_Java--定时器测试程序
- CTex下载地址和方法
- Tomcat 中文乱码
- 服务器正文21:不同编译器对预编译的处理(简单介绍msvc和gcc)及常用gcc编译指令、跨平台debug、release不同指令flag选择
- L2十档行情API接口(十档委托、买卖队列、逐笔成交)web或软件应用xml数据接口
- (rear + maxSize - front) % maxSize 公式的理解(文图详解,手把手)
- 彻底弄透Java处理GMT/UTC日期时间
- 【学习笔记】NLP之影评情感分类
热门文章
- Html5中的Video元素使用方法
- echarts折线图相关
- [傅里叶变换及其应用学习笔记] 二十四. 级联,脉冲响应
- Javascript -- In
- BNU OJ 第26303 题 Touchscreen Keyboard
- easypanel mysql错误_Easypanel v1.6(虚拟主机控制面板)图文使用教程
- php resque 计划任务,PHP-RESQUE - 实现重试
- python大作业外星人入侵_【python3小白上路系列】外星人入侵——开始
- 开课吧java_开课吧javaee企业级开发工程师 十期
- Linux多线程贝叶斯建树教程,建树经验.doc