可变参数函数

可变参数函数是接受可变数量的参数的函数。在 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