探究Go类型参数的函数
来源:互联网 发布:淘宝网电视为什么便宜 编辑:程序博客网 时间:2024/06/05 04:57
Go语言中,函数的定义与函数的调用方可以不一致。换句话说,缺乏runtime类型安全就允许函数调用端的参数与函数定义端的参数不一致。Go不支持函数的多态特性,这就决定了无法根据参数的类型或者个数定义多态的函数。但是,可以定义多态参数。Go构建函数中,append, close, delete, copy, cap 和 len函数都使用了参数多态。
Go编程中,有时候为了达到代码的简洁美而编写一些泛化的函数。这些泛化的函数利用就是Go反射机制。
/**目标函数模型为:func CallTypeFunc(f func(A) B, ps []A) []B */ //Only support Go 1.1以上的发布版本func CallTypeFunc(f interface{}, ps interface{}) interface{} { vf := reflect.ValueOf(f) vps := reflect.ValueOf(ps) // 3) Map's return type must be `[]B1` where `B == B1`. tys := reflect.SliceOf(vf.Type().Out(0)) vys := reflect.MakeSlice(tys, vps.Len(), vps.Len()) for i := 0; i < vps.Len(); i++ { y := vf.Call([]reflect.Value{vps.Index(i)})[0] vys.Index(i).Set(y) } return vys.Interface()}
第一个函数的输入参数与第二个参数切片的类型相同,参数函数的返回类型与整个函数的返回类型相同,即泛化的模型为:func CallTypeFunc(f func(A) B, ps []A) []B
。
验证上面的函数,测试代码见下文。
fmt.Printf(" CallTypeFunc(func(x string) int { return len(x) }, []string{\"1\", \"10\", \"100\"}).([]int) return :%+v", CallTypeFunc(func(x string) int { return len(x) }, []string{"1", "10", "100"}))fmt.Printf(" CallTypeFunc(func(x int) int { return x*x }, []int{1, 10, 100}).([]int) return :%+v", CallTypeFunc(func(x int) int { return x*x }, []int{1, 10, 100}))//输出结果:// CallTypeFunc(func(x string) int { return len(x) }, []string{"1", "10", "100"}).([]int) return :[1 2 3]//CallTypeFunc(func(x int) int { return x*x }, []int{1, 10, 100}).([]int) return :[1 100 10000]
认真分析上面的代码,你会发现参数有bug。没有验证输入参数类型是否符合函数的参数定义。为了修复这个问题,需要加上参数验证逻辑。
待续下篇文章!
欢迎加入我的微信公众号
阅读全文
0 0
- 探究Go类型参数的函数
- 探究float类型参数的传递方式
- 探究float类型参数的传递方式
- GO语言学习-函数探究
- 函数参数的类型
- 29.笔记go语言——函数多类型参数
- 56.笔记go语言——go的函数类型
- Go中函数的不定参数用法
- go函数类型讲解
- Go - 以任意类型的slices作为输入参数
- 关于umount2函数的MNT_DETACH参数的探究
- printf函数参数的执行顺序的简单探究
- 枚举类型的探究
- 函数参数类型的定义
- c#函数的参数类型
- 【main()的参数探究】
- 第二周项目一 探究函数参数传递的方法
- 函数模板的模板参数自动推导探究
- Dorado控件调用
- PCL安装的一些问题总结
- cudnn Installation in Linux
- 07_c++运算符重载
- python的文件类型、变量、数值和字符串
- 探究Go类型参数的函数
- dorado给指定行上色
- get和post请求
- . 使用UDP协议编写一个网络程序,设置接收端程序的监听端口是8001,发送端发送的数据是“Hello, world”。
- 展示接口中的商品,加入购物车
- IT职场求生法则-----我在IT职场打滚超过15年了,从小小的程序员做到常务副总
- Hadoop节点添加下线和磁盘扩容操作
- dorado的autoform控件赋值、取值
- thinkphp3.2.x session db 失效