可变函数

可变参数函数是接受可变数量的参数的函数。在Golang中,可以传递与函数签名中引用的类型相同的不同数量的参数。要声明可变参数函数,最终参数的类型前面带有省略号“ ...”,该省略号表示可以使用任意数量的该类型的参数来调用该函数。当您不知道要传递给函数的参数数量时,这种类型的函数很有用,最好的例子是fmt包的内置Println函数,它是可变参数。

从可变参数函数的所有参数中选择一个参数。

In below example we will are going to print s[0] the first and s[3] the forth, argument value passed to variadicExample() function.

package main

import "fmt"

func main() {
	variadicExample(" 红 ", "blue", "green", " 黄色 ")
}

func variadicExample(s ...string) {
	fmt.Println(s[0])
	fmt.Println(s[3])
}

C:\golang\example>go run test1.go
red
yellow

C:\golang\example>

运行空函数调用时需要精确,如果函数内部的代码需要一个参数而没有参数将生成错误“紧急:运行时错误:索引超出范围”。在上面的示例中,您必须传递至少4个参数。


将多个字符串参数传递给可变参数函数

The parameter s accepts an infinite number of arguments. The tree-dotted ellipsis tells the compiler that this string will accept, from zero to multiple values.

package main

import "fmt"

func main() {
	
	variadicExample()
	variadicExample(" 红 ", "blue")
	variadicExample(" 红 ", "blue", "green")
	variadicExample(" 红 ", "blue", "green", " 黄色 ")
}

func variadicExample(s ...string) {
	fmt.Println(s)
}

C:\golang\example>go run test1.go
[]
[red blue]
[red blue green]
[红色蓝色绿色黄色]

C:\golang\example>

在上面的示例中,我们使用单个和多个参数调用了该函数;并且不传递任何参数。


具有可变参数功能的普通功能参数

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
}

C:\golang\example>go run test1.go
600
400

C:\golang\example>


在可变参数函数中传递不同类型的参数

In the following example, the function signature accepts an arbitrary number of arguments of type slice.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	variadicExample(1, " 红 ", 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())
	}
}

C:\golang\example>go run test3.go
1 -- int
red -- string
true -- bool
10.5 -- float64
[foo bar baz]-切片
地图[苹果:23番茄:13]-地图

C:\golang\example>