当前位置: 首页 > news >正文

Golang 函数 不定参数

不定参数


在C语言时代大家一般都用过printf()函数,从那个时候开始其实已经在感受不定参数的魅力和价值。如同C语言中的printf()函数,Go语言标准库中的fmt.Println()等函数的实现也严重依赖于语言的不定参数功能。

我们将介绍不定参数的用法。合适地使用不定参数,可以让代码简单易用,尤其是输入输出类函数,比如日志函数等。

 


不定参数类型


不定参数是指函数传入的参数个数为不定数量。为了做到这点,首先需要将函数定义为接受不定参数类型:

func myfunc(args ...int){
   for_, arg := range args {
     fmt.Println(arg)
  }
}

这段代码的意思是,函数myfunc()接受不定数量的参数,这些参数的类型全部是int,所以它可以用如下方式调用:

myfunc(2,3,4)
myfunc(1,3,7,13)

形如...type格式的类型只能作为函数的参数类型存在,并且必须是最后一个参数。它是一个语法糖(syntactic sugar),即这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说,使用语法糖能够增加程序的可读性,从而减少程序出错的机会。

从内部实现机理上来说,类型...type本质上是一个数组切片,也就是[ ]type,这也是为什么上面的参数args可以用for循环来获得每个传入的参数。

假如没有...type这样的语法糖,开发者将不得不这么写:

func myfunc2(args []int){
  for _, arg := range args {
     fmt.Println(arg)
  }
}

从函数的实现角度来看,这没有任何影响,该怎么写就怎么写。但从调用方来说,情形则完全不同:

myfunc2([]int{1,3,7,13})

你会发现,我们不得不加上[]int{}来构造一个数组切片实例。但是有了...type这个语法糖,我们就不用自己来处理了。


不定参数的传递


假设有另一个变参函数叫做myfunc3(args...int),下面的例子演示了如何向其传递变参:

func myfunc(args ...int){
  
  //按原样传递myfunc3(args...)
  //传递片段,实际上任意的int slice都可以传进去myfunc3(args[1:]...)
}

 

任意类型的不定参数


之前的例子中将不定参数类型约束为int,如果你希望传任意类型,可以指定类型为interface{}。下面是Go语言标准库中fmt.Printf()的函数原型:

func Printf(format string, args ...interface{})
{//  ...}

用interface{}传递任意类型数据是Go语言的惯例用法。使用interface{}仍然是类型安全的,这和C/C++不太一样。关于它的用法,代码示范了如何分派传入interface{}类型的数据。

相关文章:

  • Lua学习笔记:require非.lua拓展名的文件
  • 数学建模之遗传算法
  • 2018-2022年盟浪 ESG数据
  • 城市编码对照表
  • 文件审计及文件完整性监控
  • springboot如何接入netty,实现在线统计人数?
  • Halcon Tuple相关算子(一)
  • Gateway学习和源码解析
  • 基础练习 字母图形
  • PHP8的类与对象的基本操作之成员方法-PHP8知识详解
  • Purple-Pi-OH OHOS SDK编译手册
  • 分布式网络在移动医疗场景中的应用
  • MySQL数据类型之JSON
  • UE5 ChaosVehicles载具研究
  • VS2019创建GIt仓库时剔除文件或目录
  • RabbitMQ生产故障问题分析
  • 信创丨豪越科技与达梦数据库完成产品兼容互认证
  • ISE_ChipScope Pro的使用
  • 【Java 基础篇】Java 模块化详解
  • OpenCV项目开发实战--主成分分析(PCA)的特征脸应用(附C++/Python实现源码)
  • IPO周报|本周暂无新股申购,上周上市新股中签浮盈均超1.6万
  • 张九思任电子科大副教授,曾以学生身份入选爱思唯尔全球前2%顶尖科学家
  • 人民日报和音:书写周边命运共同体建设新篇章
  • 泽连斯基称乌克兰全境响起防空警报
  • 韩国一战机飞行训练中掉落机炮吊舱和空油箱
  • 独家专访|苏童:《好天气》是一部献给中国郊区的作品