肯定有这样的一种场景,写一个函数,该函数可以接收任意类型的切片,完成相应的功能。
就好比这种情况
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) }
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/13329741.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
2019-07-17 goroutine channel
2019-07-17 json序列化和反序列化