可变参数函数
可变参数函数是接受可变数量的参数的函数。在 Golang 中,可以传递与函数签名中引用的相同类型的不同数量的参数。要声明可变参数函数,最后一个参数的类型前面有一个省略号“...”,这表明可以使用任意数量的此类参数调用该函数。当您不知道传递给函数的参数数量时,这种类型的函数很有用,最好的例子是fmt包的内置Println函数,它是一个可变参数函数。
从可变参数函数的所有参数中选择单个参数
该程序演示了在 Golang 中使用可变参数函数。可变参数函数是接受可变数量的特定类型参数的函数。
在此程序中,函数 variadicExample 采用字符串类型的可变参数,由类型名称前的 ... 指示。这意味着该函数可以接受任意数量的字符串参数。
在 main 函数中,我们调用具有四个字符串参数的 variadicExample:“红色”、“蓝色”、“绿色”和“黄色”。这些参数作为字符串切片传递给variadicExample函数的s参数。
package main
import "fmt"
func main() {
variadicExample("red", "blue", "green", "yellow")
}
func variadicExample(s ...string) {
fmt.Println(s[0])
fmt.Println(s[3])
}
输出
red
yellow
因为我们正在访问 s 切片的第一个和第四个元素。请注意,如果我们向variadicExample传递的参数少于四个,程序仍将正常运行而不会出错,但是尝试访问超出切片长度的索引将导致运行时错误。
将多个字符串参数传递给可变参数函数
该程序演示了在 Go 中使用可变参数函数,该函数允许函数接受相同类型的可变数量的参数。
在此示例中,函数variadicExample()定义为接受字符串类型的可变参数。这意味着它可以接受任意数量的字符串参数。main()函数使用不同数量的字符串参数多次调用variadicExample()。
对variadicExample()的第一次调用是在没有任何参数的情况下进行的,这是允许的,因为函数被定义为接受零个或多个字符串参数。
第二次、第三次和第四次调用将不同数量的字符串参数传递给variadicExample()。在每种情况下,该函数都使用fmt.Println()打印 s 参数的内容。
package main
import "fmt"
func main() {
variadicExample()
variadicExample("red", "blue")
variadicExample("red", "blue", "green")
variadicExample("red", "blue", "green", "yellow")
}
func variadicExample(s ...string) {
fmt.Println(s)
}
输出
[]
[red blue]
[red blue green]
[red blue green yellow]
对variadicExample()的第一次调用打印一个空切片,因为没有传递任何参数。后续调用将打印s参数的内容,该参数包含传递给函数的所有字符串参数。
具有可变参数函数参数和指定参数的函数
package main
import "fmt"
func main() {
fmt.Println(calculation("Rectangle", 20, 30))
fmt.Println(calculation("Square", 20))
}
func calculation(str string, y ...int) int {
area := 1
for _, val := range y {
if str == "Rectangle" {
area *= val
} else if str == "Square" {
area = val * val
}
}
return area
}
输出
600
400
在可变参数函数中传递不同类型的参数
在下面的示例中,函数签名接受任意数量的切片类型的参数。
package main
import (
"fmt"
"reflect"
)
func main() {
variadicExample(1, "red", true, 10.5, []string{"foo", "bar", "baz"},
map[string]int{"apple": 23, "tomato": 13})
}
func variadicExample(i ...interface{}) {
for _, v := range i {
fmt.Println(v, "--", reflect.ValueOf(v).Kind())
}
}
输出
1 -- int
red -- string
true -- bool
10.5 -- float64
[foo bar baz] -- slice
map[apple:23 tomato:13] -- map