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


—— 爱你们的小熊

相关文章
|
1天前
|
存储 安全 编译器
go语言中进行不安全的类型操作
【5月更文挑战第10天】Go语言中的`unsafe`包提供了一种不安全但强大的方式来处理类型转换和底层内存操作。包含两个文档用途的类型和八个函数,本文也比较了不同变量和结构体的大小与对齐系数,强调了字段顺序对内存分配的影响。
43 8
go语言中进行不安全的类型操作
|
1天前
|
Go
配置go语言下载包 - 蓝易云
这个命令会将包下载到你的GOPATH目录下,并自动安装它。
25 1
|
2天前
|
安全 Go 调度
Go语言中的并发编程
Go语言自带了强大的并发编程能力,它的协程机制可以让程序轻松地实现高并发。本文将从并发编程的基础概念出发,介绍Go语言中的协程机制、通道和锁等相关知识点,帮助读者更好地理解并发编程在Go语言中的实践应用。
|
4天前
|
Ubuntu Unix Linux
【GO基础】1. Go语言环境搭建
【GO基础】1. Go语言环境搭建
|
5天前
|
JSON 前端开发 Go
lucky - go 语言实现的快速开发平台
go 语言实现的快速开发平台,自动生成crud代码,前端页面通过json配置,无需编写前端代码。
11 0
|
6天前
|
存储 Java Go
Go 语言切片如何扩容?(全面解析原理和过程)
Go 语言切片如何扩容?(全面解析原理和过程)
16 2
|
6天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
安全 Java Go
Go基础:函数、闭包、递归
Go基础:函数、闭包、递归
149 0
Go基础:函数、闭包、递归
Go基础(复杂类型):函数的闭包
函数的闭包 Go 函数可以是一个闭包。闭包是一个函数值,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,换句话说,该函数被“绑定”在了这些变量上。
931 0
|
6天前
|
算法 Go 分布式数据库
构建高可用的分布式数据库集群:使用Go语言与Raft共识算法
随着数据量的爆炸式增长,单一数据库服务器已难以满足高可用性和可扩展性的需求。在本文中,我们将探讨如何使用Go语言结合Raft共识算法来构建一个高可用的分布式数据库集群。我们不仅会介绍Raft算法的基本原理,还会详细阐述如何利用Go语言的并发特性和网络编程能力来实现这一目标。此外,我们还将分析构建过程中可能遇到的挑战和解决方案,为读者提供一个完整的实践指南。

推荐镜像

更多