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 回复

感谢您的解释。

更多关于Golang中三个点(...)的作用是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


数组是一个整数切片,因此 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...)。

回到顶部