文章网站模板,淘宝网站怎样建,企业做一个网站多少钱,网站素材图片接连两篇函数专题深度解析#xff0c;相信大家已经对函数的语法有了深入的了解。函数简单使用和基本知识解析匿名函数和闭包五一放假期间#xff0c;我懂得#xff0c;估计你们都不想学习。小熊这两天因为个人种种令人难受的原因#xff0c;没有能更新#xff0c;也没有提…接连两篇函数专题深度解析相信大家已经对函数的语法有了深入的了解。函数简单使用和基本知识解析匿名函数和闭包五一放假期间我懂得估计你们都不想学习。小熊这两天因为个人种种令人难受的原因没有能更新也没有提前请假给大家道歉歉了。这次小熊给大家带来了一个函数的特性【可变参数】作为函数专题的结束。有没有发现我们有时候会用到的输出、错误输出、字符串格式化系统函数你可以传入任意个数的参数他全都能处理fmt.Println(a,b,c,d)
就像一个任劳任怨的老父亲那到底是为什么呢因为因为在go语言中语言级别自带了一种语法可以声明可变参数func 函数名(固定参数v ...T) (返回参数列表){
函数体
}
怎么用先和小熊一起试试写一个不定参数累加的函数func sum(t ...int) (res int) {for _, v : range t {res v}return res
}
fmt.Println(sum(1, 2, 3, 4, 5))
输出结果15如果连参数类型都不知道怎么办上一节我们已知参数类型是int还记得我们前面说过的switch判断类型做处理的例子吗switch和type switch。参考这个例子重写下函数让他可以接收任意类型的参数。func sumNum(t ...interface{}) (res float64){for _,tmp : range t{switch v :tmp.(type) {case int:res float64(v)case float64:res vcase float32:res float64(v)}}return res
}
测试下fmt.Println(sumNum(1,2.1,asd,true))
因为忽略了输出3.1但是上面的例子并没有覆盖全部的数字如果一个一个类型的匹配会疯掉的。有没有更好的方法可以一下子匹配到所有的数字func sumNum(t ...interface{}) (res float64) {for _, tmp : range t {switch v : tmp.(type) {case int, int8, int16, int32, int64, uint, uint8, uint16, uint32,uint64, float32, float64, complex64, complex128:convertStr : fmt.Sprintf(%v, v)convertFloat64, _ : strconv.ParseFloat(convertStr, 64)res convertFloat64}}return res
}
上面的代码在case里一下子匹配了所有可能的数字类型再用格式化输出转换成字符串最后转换成float64来使用这是一种折中的办法速度可能会比较慢因为格式化内部逻辑比较复杂消耗速度。为了保证速度还是不要省掉一大堆的case明确了类型再做强转。留给你的寻找的答案有没有一种只留一个case同时处理速度又快的方法呢—— 爱你们的小熊