GO 可变参数 ...

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

参考

apocelipes
Go官方文档

猜你喜欢

转载自blog.csdn.net/qq_40601372/article/details/104688009