一.可变参数基本使用
- 可变参数用途:收集实参放到1个切片里,len=cap;切片不是要让你修改的,而是让你遍历的
- 可变参数必须在参数列表最后一个,只能出现一次
package main
import "fmt"
//1.只有可变参数 ...int可以接受0到多个参数
func fn1(nums ...int) {
fmt.Printf("%T %v %v %v\n", nums, nums, len(nums), cap(nums)) //int类型的切片
}
//2.混合参数
func fn2(x, y int, nums ...int) {
fmt.Printf("%d,%d,%T %v %v %v\n", x, y, nums, nums, len(nums), cap(nums))
}
func main() {
// fn1(1, 3, 5, 6)
// fn2() //不行
// fn2(1)//不行
fn2(1, 2) //可以
fn2(3, 4, 5, 6, 7)
}
- 结果
![](https://img2023.cnblogs.com/blog/1472910/202301/1472910-20230116003445456-514932065.png)
二.切片传递
package main
import "fmt"
func fn4(x, y int) {
fmt.Println(x, y)
}
func fn6(nums ...int) {
fmt.Printf("%p %p %v\n", &nums, &nums[0], nums)
fmt.Printf("%T %v %v %v\n", nums, nums, len(nums), cap(nums))
}
func main() {
var p = []int{1, 3}
fmt.Printf("%p %p %v\n", &p, &p[0], p)
// fn4(p...) //不行分解,因为fn4中没有可变函数
fn6(p...) //把p{1,3}切片分解到fn6函数中fn6生成了新header底层,数组用的是p数组,这个在go中叫切片传递,只能在可变参数中时使用
}
- 结果
![](https://img2023.cnblogs.com/blog/1472910/202301/1472910-20230119000015746-40670487.png)
三.