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

简介: 三分钟学 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,同时处理速度又快的方法呢?


—— 爱你们的小熊

相关文章
|
7月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
697 0
|
5月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
536 43
Go语言深度解析:从入门到精通的完整指南
|
5月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
308 2
|
6月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
7月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
457 1
|
7月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
511 0
|
7月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
340 0
|
7月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
391 0
|
7月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
426 0
|
JSON Prometheus Cloud Native
go解析Prometheus的数据
访问一个api, 返回如下数据: {"status":"success","data":{"resultType":"matrix","result":[{"metric":{},"values":[[1473820558.
2830 0

推荐镜像

更多
  • DNS