非零基础自学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)
}
运行结果