可变参数(Variadic Functions)- 《Go语言实战指南》

Go 语言允许函数接受不定数量的参数,也称"可变参数"。这为构建灵活的函数提供了便利,常用于求和、拼接等操作。


一、语法格式

复制代码
func 函数名(参数名 ...类型) 返回值类型 {
    // 函数体
}

可变参数本质上是一个切片(slice) ,可以使用 forrange 遍历。


二、基础示例:求和函数

复制代码
func sum(nums ...int) int {
    total := 0
    for _, v := range nums {
        total += v
    }
    return total
}

fmt.Println(sum(1, 2, 3))         // 输出 6
fmt.Println(sum(5, 10, 15, 20))   // 输出 50

三、可变参数的传递机制

传入的是零个或多个参数:

复制代码
fmt.Println(sum())                // 输出 0(空切片)

如果你已经有一个 []int 切片,可以通过 ... 传入:

复制代码
nums := []int{2, 4, 6}
fmt.Println(sum(nums...))        // 输出 12

四、与固定参数混用

可变参数可以与固定参数组合使用,但必须放在参数列表最后

复制代码
func greet(name string, messages ...string) {
    for _, msg := range messages {
        fmt.Printf("%s: %s\n", name, msg)
    }
}

greet("Alice", "早上好", "下午好", "晚安")

五、零参数情况的处理

如果调用时不传可变参数,函数仍能正常执行:

复制代码
greet("Bob") // 不输出任何内容

六、可变参数是切片(slice)

你可以对它执行切片操作、获取长度等:

复制代码
func debug(values ...int) {
    fmt.Println("总共参数:", len(values))
    fmt.Println("前两个参数:", values[:2])
}
debug(1, 2, 3, 4)

七、不能有多个可变参数

Go 不支持多个可变参数,以下写法是错误的:

复制代码
// ❌ 错误写法
func wrong(a ...int, b ...string) {}

八、小结

特性 说明
参数类型 func f(...type) 语法
调用方式 f(1, 2, 3)f(slice...)
与固定参数组合 可变参数必须在最后
零参数调用 可以调用,如 f()
实际类型 可变参数是一个切片 []type
多个可变参数 不支持,只能定义一个

可变参数让你的函数更灵活,适合用于处理动态长度的数据列表。

相关推荐
AI科技星2 分钟前
全维度相对论推导、光速螺旋时空与北斗 GEO 钟差的统一理论
开发语言·线性代数·算法·机器学习·数学建模
ECT-OS-JiuHuaShan6 分钟前
科学的本来意义,是基于规范的共识逻辑,而非共识方法
人工智能·科技·学习·算法·生活
木子墨51612 分钟前
LeetCode 热题 100 精讲 | 动态规划进阶篇:最大子数组和 · 分割等和子集 · 最长公共子序列 · 打家劫舍 III
数据结构·c++·算法·leetcode·动态规划·力扣
li16709027017 分钟前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio
Z1Jxxx24 分钟前
C++ P1150 Peter 的烟
数据结构·c++·算法
踮起脚看烟花32 分钟前
chapter10_泛型算法
c++·算法
笨笨饿32 分钟前
# 52_浅谈为什么工程基本进入复数域?
linux·服务器·c语言·数据结构·人工智能·算法·学习方法
Code-keys32 分钟前
ADSP/ARM 性能/稳定性排查专栏总述
arm开发·算法·边缘计算·dsp开发
山栀shanzhi36 分钟前
C++四大常见排序对比
c++·算法·排序算法
Allen_LVyingbo1 小时前
量子测量三部曲:投影测量、POVM 与坍缩之谜—从形式主义到物理图像
算法·性能优化·健康医疗·量子计算·空间计算