三分钟学 Go 语言——函数深度解析(下) 可变参数

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 三分钟学 Go 语言——函数深度解析(下) 可变参数

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



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

aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDQtMjktMTYwMzU2LmpwZw.png


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


aHR0cHM6Ly9jb2RpbmczbWluLm9zcy1hY2NlbGVyYXRlLmFsaXl1bmNzLmNvbS9jb2RpbmczbWluLzIwMjAtMDUtMDMtMDkxNjA1LmpwZw.png


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


有没有发现?


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


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


—— 爱你们的小熊

目录
打赏
0
0
0
0
1
分享
相关文章
|
12天前
|
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
54 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
go语言中结构体(Struct)
go语言中结构体(Struct)
102 71
|
1月前
|
go语言中的数组(Array)
go语言中的数组(Array)
106 67
|
7天前
|
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
38 12
|
10天前
|
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
20 0
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数
关于Go语言中的函数方法
关于Go语言中的函数方法 方法是什么 函数和方法的区别 Go中的“多态”
132 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等