专栏首页技术面面观三分钟学 Go 语言——函数深度解析(下) 可变参数

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

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

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

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

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

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

有没有发现?

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

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

—— 爱你们的小熊

本文分享自微信公众号 - 编程三分钟(coding3min),作者:小熊爱编程

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 三分钟学 Go 语言——函数深度解析(中)

    上回函数深度解析给大家聊了一些函数的基本知识,不知道还有没有人记得,不记得赶紧回去复习!

    编程三分钟
  • 如何把握好面试的最后一问 ?

    要积极稳妥,切莫减分、丢分、扣分。比如,你提问的问题很傻很天真,比如你提问的问题弄巧成拙,比如你提问面试中已经问过的问题,比如你提问了敏感问题,比如你提问了面试...

    编程三分钟
  • Vim高手,从来不用鼠标

    “平时不可缺少的会用到vim,但是避免不了鼠标,事实上,省略鼠标是完全可以的,没有想像中那么难,看我短短几行带大家一起省略鼠标。——编程三分钟”

    编程三分钟
  • python函数(二)

    #6.传递任意个数的参数; #在定义函数时,若参数名前面使用“”,则表示可接受任意个数的参数,这些参数保存在一个元祖中。 #定义函数,代表b是一个元祖,可以接受...

    py3study
  • Python中的函数(一)

    数学函数的定义:一般在一个变化过程中,如果有两个变量,X,Y,并且对于x的每一个确定值,y都有唯一与之对应的值,那么我们把x称为自变量,y为因变量,y为x的函数...

    py3study
  • Python基础入门_4函数

    第四篇内容,这次介绍下函数的基本用法,包括函数的定义、参数的类型、匿名函数、变量作用域以及从模块导入函数的方法,目录如下所示:

    材ccc
  • 作为2018最靠谱的项目,还没有自己的小程序?

    “小程序代表的是未来,未来万事万物可能都包括信息,而小程序刚好是这样一种信息载体和表达方式。”

    用户1745481
  • 微信小程序开发工具 微信小程序平台开发小程序公司

    小程序倡导更加便捷的生活服务理念,无需下载,唾手可得,即用即走,未来,普通人的生活里,小程序将无处不在。

    微信小程序开发加盟服务商
  • 微信小程序链接一切场景 不仅拯救手机内存还将拯救9000万实体店

    微信小程序甫一诞生,即引发业内外人士的高度关注和热烈讨论。“好的产品是用完即走”,小程序正是一款能够实现“用完即走”的产品,无须安装、触手可及,却能连接起许许多...

    速成应用小程序开发平台
  • 渗透测试 对网站安全态势感知介绍

    解释:融合认知到的数据信息和信息内容,详细分析其关联性。这是一个至关重要的等级,由于态势感知远远地不止步于认知显示屏上所表明的一大堆数据信息。真真正正须要达到的...

    技术分享达人

扫码关注云+社区

领取腾讯云代金券