跳至主要内容

博文

目前显示的是 九月, 2025的博文

Go: slice作为函数参数的解包

  在 Go 语言里, ... 跟在 slice 后面 ,是 “解包(unpack)”操作 ,它的作用是 把一个切片的元素逐个展开,作为可变参数传入函数 ,而不是把整个切片当作一个单独的参数。 📌 典型场景: append 追加切片 s1 := []int{1, 2, 3} s2 := []int{4, 5, 6} // 如果直接 append(s1, s2) 会报错,因为 s2 是一个切片,不是单个元素 // 用 ... 解包,把 s2 的每个元素依次追加到 s1 s1 = append(s1, s2...) fmt.Println(s1) // 输出: [1 2 3 4 5 6] 这里的 s2... 就是把 s2 展开成 4, 5, 6 三个独立的参数传给 append 。 📌 适用范围 ... 这种解包语法 只能用在函数调用的最后一个参数位置 ,并且该参数必须是 可变参数(variadic parameter) ,例如: func sum(nums ...int) int { total := 0 for _, v := range nums { total += v } return total } arr := []int{1, 2, 3} fmt.Println(sum(arr...)) // 等价于 sum(1, 2, 3) 在 Go 里,严格意义上并没有一个和 ... 解包 对称 的“打包/合并”运算符。 所谓“合并”切片,通常是通过 append 或 copy 等函数来实现的,而不是用某个单独的语法符号。 🔹 常见的“合并”方式 1. 用 append 合并两个或多个切片 a := []int{1, 2, 3} b := []int{4, 5, 6} c := []int{7, 8} // 合并 a 和 b a = append(a, b...) // b... 是解包,把 b 的元素追加到 a // 再合并 c a = append(a, c...) fmt.Println(a) // [1 2 3 4 5 6 7 8] 这里虽然用到了 ... ,但它的作用是解包参数,合并的动作是由 append 完成的。 2. 用...