可变参数

* 本页面主要介绍Go语言函数可变参数的相关内容。

可变参数(Variable Parameters),从字面意义上,我们就可以理解是应用在参数个数无法在编码过程中确定的场景下。其中fmt包下的Printf和Println函数是咱们常用到的可变参数的函数。

参数数量可变的函数称之为可变参数函数,主要是在使用语法糖"...type"(syntactic sugar)。

一、可变参数定义

可变参数就是一个占位符,你可以将1个或者多个参数赋值给这个占位符,这样不管实际参数的数量是多少,都能交给可变参数来处理,可变参数使用name ...Type的形式声明在函数的参数列表中,而且需要是参数列表的最后一个参数。也就是Golang可变参数本质上就是 slice。只能有一个,且必须是最后一个。来看一个例子:

  func Printf(format string, a ...int) (n int, err error)

在函数中将转换为对应的[]Type类型,所以我们可以像使用slice时一样来获取传给函数的参数们(通过arg[index]依次访问所有参数,通过len(arg)来判断传递参数的个数)。这也是GO语法简洁的其中一个体现。

如果可变参数里每个参数的类型都不确定,那需要用到...interface{}

  func myfunc(args ...interface{}) { }
二、传递参数给可变参数

这里主要有两种形式:

  • 与通常的参数传递没有什么区别,直接传递所有参数即可(这时会涉及一个内部自动将其转换为切片类型的过程)
  •   sum(1, 2, 3)
      sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  • 第二种形式是使用...运算符以变量...的形式进行参数传递,这里的变量必须是与可变参数类型相同的slice。最常用在内置函数append里
  •   numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
      sum(numbers...)
    
      //append
      result := []int{1, 3}
      data := []int{5, 7, 9}
      // result == []int{1, 3, 5, 7, 9}
      result = append(result, data...) 

有两个需要注意的地方:

  • 只能对slice类型使用...运算符
  • 不能把独立传参和...运算符混用
  //case one
  arr := [...]int{1, 2, 3, 4, 5}
  sum(arr...) // 编译无法通过
  //cannot use arr (type [5]int) as type []int in argument to sum

  //case two
  slice := []int{2, 3, 4, 5}
  sum(1, slice...) // 无法通过编译 

这部分内容就总结到这里,Get了不?


* 本页内容参考以下数据源:

  • 《Go程序设计语言》
  • https://www.cnblogs.com/apocelipes/p/9861315.html

凯冰科技 · 代码改变世界,技术改变生活
Next Page→