Skip to content

在 Go 语言中,可变参数(variadic parameters)允许函数接受不定数量的参数:参数类型前加 ...,函数内部把它们当作一个切片。

可变参数的定义 ​

可变参数函数的定义语法是在参数类型之前使用三个点 ...。在函数内部,可变参数作为一个切片处理。

示例:定义和使用可变参数函数 ​

go
package main

import "fmt"

// 定义一个可变参数函数
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(4, 5, 6, 7)) // 输出:22
    fmt.Println(sum())           // 输出:0
}

nums 在函数内部作为一个切片处理,用 range 遍历即可求和。

传递可变参数 ​

调用可变参数函数时,可以直接传递任意数量的参数。还可以将现有的切片传递给可变参数函数,但需要在切片变量后加上 ... 以展开切片。

示例:传递切片作为可变参数 ​

go
package main

import "fmt"

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {
    numbers := []int{1, 2, 3, 4, 5}
    fmt.Println(sum(numbers...)) // 输出:15
}

sum(numbers...) 把 numbers 切片展开成一个个参数传给 sum。

可变参数和其他参数 ​

在一个函数中,可以将可变参数与其他固定参数一起使用。注意,可变参数必须放在参数列表的最后。

示例:固定参数和可变参数 ​

go
package main

import "fmt"

func greet(prefix string, names ...string) {
    for _, name := range names {
        fmt.Printf("%s %s\n", prefix, name)
    }
}

func main() {
    greet("Hello", "Alice", "Bob", "Charlie")
    // 输出:
    // Hello Alice
    // Hello Bob
    // Hello Charlie
}

内部实现机制 ​

在函数内部,可变参数作为切片处理,这意味着可以使用切片的所有特性和方法。

示例:访问可变参数 ​

go
package main

import "fmt"

func printDetails(details ...string) {
    fmt.Println("Number of details:", len(details))
    for i, detail := range details {
        fmt.Printf("Detail %d: %s\n", i+1, detail)
    }
}

func main() {
    printDetails("Name: Alice", "Age: 30", "Country: Wonderland")
    // 输出:
    // Number of details: 3
    // Detail 1: Name: Alice
    // Detail 2: Age: 30
    // Detail 3: Country: Wonderland
}

details 就是一个切片:用 len 取长度,用下标访问单个元素。

总结 ​

可变参数解决的是参数个数不定的问题:定义时在类型前加 ...,调用时可以直接传值,也可以用 slice... 把切片展开传入;函数内部拿到的就是一个切片。限制只有一条:它必须是参数列表的最后一项。

参考资料 ​

相关页面 ​

Hello Golang