GO 可变参数 …args & args…
1、内部实现
可变参数 …Type 等效于 []Type 的切片,当 …Type 未传递数值时为 的切片 []Type, Type类型切片的长度和容量根据使用时参数的数量的定
使用时需要在 … 前或后制定参数的类型,…在类型之后则不会创建新的切片, 而是将切片拆解成单个元素传递
package main
import "fmt"
func main() {
ArraryA := []int{1, 2, 3, 4}
fmt.Println("Base Slice: ", ArraryA)
ArraryA = append(ArraryA, []int{5, 6, 7, 8}...)
fmt.Println("New Slice: ", ArraryA)
}
// OutPut:
// Base Slice: [1 2 3 4]
// New Slice: [1 2 3 4 5 6 7 8]
2、使用
只能对slice类型使用 …
因为可变参数实际上是切面类型,Go语言不通类型不允许相互赋值
会直接提示类型错误
package main
import "fmt"
func main() {
ArraryA := [3]int{1, 2, 3}
// panic Error:
// cannot use ArraryA (type [3]int) as type []int in argument to Reporter
Reporter(ArraryA...)
}
func Reporter(args ...int) {
fmt.Println("Args:", args)
}
不能将独立传参与 … 混用
独立传参与 … 一起使用时,相当于两个参数
ArraryA := [3]int{1, 2, 3}
// panic Error:
// too many arguments in call to Reporter
// have (number, [3]int...)
// want (...int)go
Reporter(4, ArraryA...)
3、函数间的传递
package main
import "fmt"
func main() {
ArraryA := []string{"Sink", "Rain", "Tom"}
Reporter("Hello: ", ArraryA...)
}
func Reporter(geeting string, args ...string) {
fmt.Println("Args:", args)
for i, v := range args {
fmt.Printf("%dth Welcome: %s\n", i, v)
}
}
// OutPut:
// Args: [Sink Rain Tom]
// 0th Welcome: Sink
// 1th Welcome: Rain
// 2th Welcome: Tom