golang切片拼接与...(three dots)的作用

先上代码

func main() {
	nums1 := []int{1,2,3,4}
	nums2 := []int{2,6,7,8}
	nums1 = append(nums1, nums2...)
	fmt.Println(nums1)
}

输出结果
[1 2 3 4 2 6 7 8]

要了解为什么可以这样传递,我们就需要深入了解一下golang中的...作用是什么

1. golang中...的作用

1.1 用法一

我们都知道在golang中可以使用...来作为函数的可变参数,使用这种写法,其中arg作为可变参数项可以接受多个int型数据。

func test(arg ...int){
	fmt.Printf("arg类型: %T\n", arg)
	fmt.Printf("arg地址: %p\n", &arg)
	fmt.Println(arg)
	arg[1] = 12
}

func main() {
	nums1 := []int{1,2,3,4}
	fmt.Printf("nums1地址: %p\n", &nums1)
	test(nums1...)
	fmt.Println(nums1)
}

输出结果:
nums1地址: 0xc00000c060
arg类型: []int
arg地址: 0xc00000c080
[1 2 3 4]
[1 12 3 4]

但是我们还有几个细节需要注意

  • 将切片传递给可变参数,并不会新创建一个切片,相当于引用传递,在test函数中修改切片的值,会对原来的切片有影响
  • 从程序的效果来看确实是引用传递,但是nums1arg的地址却不一样,这一点可以探究一下
  • arg的类型可以看出,arg确实也为切片类型
  • 如果我们直接将切片传入可变参数是会报错的,需要在切片后加...,因为加入...之后会将切片unpacking(我的理解是将切片拆箱,将其中的值传递给可变参数,传递后再将其包装成切片)

用法二

func main(){
    arr := [...]int{1,2,3,4}
}

在定义数组时也可以使用..., 使用这种方法可以不用显示的声明数组长度。

发布了31 篇原创文章 · 获赞 25 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/s_842499467/article/details/104358776
今日推荐