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