非零基础自学Golang

第7章 函数

7.4 可变参数

Go语言支持可变参数的特性,即函数声明时可以没有固定数量的参数。

可变参数的函数格式如下:

func 函数名 (固定参数列表, v ... T) (返回参数列表) {
    函数体
}
  • 可变参数一般放在函数参数列表的末尾,也可不存在固定参数列表。
  • “v …T”代表的其实就是变量v为T类型的切片,v和T之间为三个“.”。
7.4.1 可变参数函数的使用

对于动手写7.1.1,add函数只能对两个int类型的数进行加法计算,现在我们可以使用可变参数实现任意个int类型数的加法运算,最后返回加法结果。

[ 动手写 7.4.1 ]

package main

import "fmt"

func add(slice ...int) int {

   sum := 0
   for _, value := range slice {
      sum = sum + value
   }

   return sum
}

func main() {

   fmt.Println("1+2+...+9+10 = ", add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

}

运行结果

在这里插入图片描述

在使用可变参数的函数体中,我们常常会使用for循环来对切片中的项进行操作。

7.4.2 可变参数与内置函数

Go语言中许多内置函数的参数都用了可变参数,比如最常用的fmt包中的Println函数和Printf函数。

fmt包中的Println函数源码如下(在GoLand编辑器中,可以将鼠标移到目标函数上,按下ctrl+鼠标左键来跳转到函数定义的代码块),Println函数所有的参数都为可变参数:

// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...any) (n int, err error) {
   return Fprintln(os.Stdout, a...)
}

在这里插入图片描述

Printf函数源码如下,第一个参数指定了需要打印的格式:

// Printf formats according to a format specifier and writes to standard output.
// It returns the number of bytes written and any write error encountered.
func Printf(format string, a ...any) (n int, err error) {
   return Fprintf(os.Stdout, format, a...)
}

在这里插入图片描述

7.4.3 可变参数的传递

可变参数本质上是一个切片,如果要在多个函数中传递可变参数,可在传递时添加“…”。

我们对动手写7.4.1的例子稍加改动来进行可变参数传递:

[ 动手写 7.4.2 ]

package main

import "fmt"

func addall(slice ...int) {

   sum := 0
   for _, value := range slice {

      sum = sum + value
   }

   fmt.Println(sum)
}

func add(num ...int) {
   addall(num...)
}

func main() {

   add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}

运行结果

在这里插入图片描述

如果想传递可变参数本身,可将addall函数的可变参数改为切片:

[ 动手写 7.4.3]

package main

import "fmt"

func addall(slice []int) {

   sum := 0
   for _, value := range slice {

      sum = sum + value
   }

   fmt.Println(sum)
}

func add(num ...int) {
   addall(num)
}

func main() {

   add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}

运行结果

在这里插入图片描述