接连两篇函数专题深度解析,相信大家已经对函数的语法有了深入的了解。

  • 函数简单使用和基本知识解析
  • 匿名函数和闭包

五一放假期间,我懂得,估计你们都不想学习。

小熊这两天因为个人种种令人难受的原因,没有能更新,也没有提前请假,给大家道歉歉了。

这次小熊给大家带来了一个函数的特性【可变参数】,作为函数专题的结束。

有没有发现?

我们有时候会用到的输出、错误输出、字符串格式化系统函数,你可以传入任意个数的参数,他全都能处理!

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,同时处理速度又快的方法呢?

—— 爱你们的小熊

sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数相关推荐

  1. operate函数_跟着 redux 学 compose组合函数

    ▲ 点击上方蓝字关注我 ▲ 把你的心 我的心串一串 串一株幸运草 串一个同心圆 文 / 景朝霞 来源公号 / 朝霞的光影笔记 ID / zhaoxiajingjing 目录0 / 热热身1 / red ...

  2. python爬虫之bs4库_三分钟搞定bs4库的解析器

    The Dormouse's story Once upon a time there were three little sisters; and their names were Elsie, L ...

  3. 翻译:三分钟学懂JSON

    Understanding JSON: the 3 minute lesson 三分钟学懂JSON Two months ago you'd never heard of JSONIf you are ...

  4. python高阶函数(三分钟读懂)

    python高阶函数(三分钟读懂) 函数式编程 Python中,函数是一等对象 一等对象:具有特点 ① 对象是在运行时创建的 ② 能赋值给变量或作为数据结构中的元素 ③ 能作为参数传递 ④ 能作为返回 ...

  5. DL:听着歌曲《成都》三分钟看遍主流的深度学习的神经网络的发展框架(1950~2018)

    DL:听着歌曲<成都>三分钟看遍主流的深度学习的神经网络的发展框架(1950~2018) 视频链接:听着歌曲<成都>三分钟看遍主流的深度神经网络的发展框架(1950~2018) ...

  6. 数据库创建函数_达梦数据库创建UUID函数

    数据库创建函数_达梦数据库创建UUID函数 接触达梦数据库有一段时间了,整理了一些资料,今天分享一下达梦数据UUID自定义函数 UUID函数定义 很多数据库都有提供UUID函数,可是接触达梦数据库后, ...

  7. 《C语言内核深度解析》——笔记及拓展(1)

    文章是我前几天读了朱有鹏,张先凤老师的<嵌入式Linux与物联网软件开发:C语言内核深度解析>写的,拜读之后,虽没有醍醐灌顶,至少解开了我之前的一些疑惑. <嵌入式Linux与物联网 ...

  8. 嵌入式Linux与物联网软件开发:C语言内核深度解析

    嵌入式Linux与物联网软件开发:C语言内核深度解析     1.C语言与内存         1.引言         2.计算机程序运行的目的         3.位.半字.字的概念和内存位宽   ...

  9. 《嵌入式Linux与物联网软件开发——C语言内核深度解析》一第1章 C语言与内存1.1 引言...

    本节书摘来自异步社区<嵌入式Linux与物联网软件开发--C语言内核深度解析>一书中的第1章,第1.1节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区"华章计算机&quo ...

最新文章

  1. Python修改Mitsuba的XML相关参数
  2. .NET泛型解析(下)
  3. PTA 基础编程题目集 7-7 12-24小时制 C语言
  4. linux 下jdk的卸载与安装
  5. mysql协议重传,MySQL · 源码分析 · 网络通信模块浅析
  6. Starling自适应设备大小的做法
  7. VSCode下载与安装
  8. jcr多久更新一次_sci分区什么时候更新
  9. vue+three.js导入obj模型不显示问题
  10. 极智开发 | Go 安装教程
  11. 给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢?
  12. c语言剧透,破镜重圆 ·《C语言修仙》by 十四洲
  13. The value of ESP was not properly saved across a function call解决方案
  14. IBM DB2基础知识学习作业
  15. C语言求CHO的相对分子质量
  16. win10查看笔记本电脑电池健康度
  17. rocket使用实例
  18. 【AAAI2021】Dual-Level Collaborative Transformer for Image Captioning
  19. 数据分析实践——面试官:如果DAU下降如何归因?(以抖音为例)
  20. 【攻破css系列——第二天】字体属性和文字属性

热门文章

  1. jquery ajax 解决跨域访问问题
  2. 生活感悟——和尾号990的滴滴师傅的聊天
  3. Android okhttp3使用实例,OKhttp设置请求超时时间,okgo使用demo
  4. windows客户端性能测试之内存泄露检查工具umdh.exe
  5. 服务器的性能监测及工具(profmon)
  6. 支付宝当面付接口如何计算优惠
  7. Lock锁实现多线程卖票
  8. linux malloc命令,减少 curl 中内存分配操作(malloc)
  9. 2021年峰峰春晖中学高考成绩查询,峰峰春晖中学2019年录取分数线
  10. Python_自定义关键字的使用