Golang中三个点(...)的作用是什么?
Golang中三个点(…)的作用是什么?
package main
import "fmt"
func main() {
var array = []int{1, 2, 3, 4, 5}
fmt.Println(array)
array = append(array [:1], array [2:]...) // 三个点。
fmt.Println(array)
}
3 回复
数组是一个整数切片,因此 append 函数中的参数必须是整数。
第一个参数 array[:1] = 1 是整数,所以没问题。
下一个参数 array[2:] = [3 4 5],三个点将这个切片转换为 3, 4, 5。
对于编译器来说,最终的语句是 append(1, 3, 4, 5)。
... 参数语法创建了一个可变参数。它可以接受零个或多个参数,并将它们作为切片来引用。
在Go语言中,三个点(...)有两种主要用途:
1. 可变参数(Variadic Parameters)
在函数定义中,...表示可变参数:
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func main() {
fmt.Println(sum(1, 2, 3)) // 输出: 6
fmt.Println(sum(1, 2, 3, 4, 5)) // 输出: 15
}
2. 切片展开(Slice Unpacking)
在函数调用时,...用于将切片展开为单独的参数:
func printNumbers(a, b, c int) {
fmt.Println(a, b, c)
}
func main() {
nums := []int{1, 2, 3}
printNumbers(nums...) // 相当于 printNumbers(1, 2, 3)
}
3. 数组字面量中的长度推断
在数组声明中,...让编译器自动计算数组长度:
arr := [...]int{1, 2, 3, 4, 5}
fmt.Printf("数组长度: %d\n", len(arr)) // 输出: 5
示例代码分析
你提供的代码中,array[2:]...就是将切片array[2:]展开为单独的参数:
array = append(array[:1], array[2:]...)
// 等价于:
// array = append(array[:1], array[2], array[3], array[4], ...)
这行代码的作用是删除索引为1的元素(值为2),最终array变为[1 3 4 5]。
另一个实际示例
package main
import "fmt"
func mergeSlices(slices ...[]int) []int {
var result []int
for _, s := range slices {
result = append(result, s...)
}
return result
}
func main() {
s1 := []int{1, 2}
s2 := []int{3, 4, 5}
s3 := []int{6, 7}
merged := mergeSlices(s1, s2, s3)
fmt.Println(merged) // 输出: [1 2 3 4 5 6 7]
}
在这个例子中,...既用于函数参数(slices ...[]int),也用于切片展开(s...)。

