Go语言不定长参数使用详解

不定长参数(Variadic Parameters)使用详解

核心概念
  1. 语法特性...T 表示函数可接受任意数量的T类型参数
  2. 底层实现 :不定长参数在函数内部实际存储为切片类型 []T
  3. 展开操作符 :调用时使用 slice... 可将切片展开为独立参数
函数定义对比
go 复制代码
// 不定长参数形式
func hello(nums ...int) {
fmt.Printf("类型:%T,值:%v\n", nums, nums) // 输出:类型:[]int,值:[1 2 3]
}

// 切片参数形式
func world(nums []int) {
fmt.Printf("类型:%T,值:%v\n", nums, nums) // 输出:类型:[]int,值:[1 2 3]
}
调用方式差异
调用场景 hello(...int) world(\[\]int)
空参数 hello() world(nil) ⚠️
离散参数 hello(1, 2, 3) 不支持 ❌
直接传切片 hello([]int{1,2,3}...) world([]int{1,2,3})
空切片 hello([]int{}...) world([]int{})
关键注意事项
  1. 参数位置:不定长参数必须是函数的最后一个参数

    go 复制代码
    func demo(a string, nums ...int) {}  // 有效
    func errorDemo(nums ...int, a string) {} // 编译错误
  2. 类型安全:所有参数必须匹配类型

    go 复制代码
    hello(1, "2", 3) // 编译错误(类型不匹配)
  3. 空参数处理

    go 复制代码
    hello() // nums为nil切片(len=0, cap=0)
    world(nil) // 需要处理nil指针情况
实际应用场景
  1. 日志函数

    go 复制代码
    func Log(prefix string, messages ...string) {
        fmt.Printf("[%s] %v\n", prefix, strings.Join(messages, " "))
    }
  2. 数学计算

    go 复制代码
    func Max(values ...int) int {
        if len(values) == 0 { return 0 }
        max := values[0]
        for _, v := range values {
            if v > max { max = v }
        }
        return max
    }
扩展特性
  1. 混合类型参数(需配合interface{}):

    go 复制代码
    func PrintAll(values ...interface{}) {
        for _, v := range values {
            fmt.Printf("%v ", v)
        }
    }
    // 使用:PrintAll(42, "hello", 3.14)
  2. 切片转换技巧

    go 复制代码
    // 将普通切片转换为不定长参数
    intSlice := []int{1, 2, 3}
    hello(intSlice...)  // 等效于 hello(1, 2, 3)
相关推荐
计算机毕设定制辅导-无忧学长18 分钟前
《基于SpringBoot的马术俱乐部管理系统》
java·spring boot·后端
摇滚侠19 分钟前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 JDBC 事务管理 阅读笔记 33
spring boot·笔记·后端
Persistent的粽子!20 分钟前
C++:类与对象(二)
开发语言·c++
Dreams°12325 分钟前
【Java后端+Vue前后端分离:内网正常、公网访问异常|5个高频经典踩坑完整复盘】
java·开发语言·vue.js
学长毕业设计1 小时前
基于SpringBoot的民间艺术传承管理系统(源码+文档+讲解视频)
java·spring boot·后端
小蒜学长1 小时前
基于Springboot+Vue的环保行动志愿者招募系统设计与实现(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端
.YM.Z1 小时前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
李燚1 小时前
把规则搬回家:三个 BC 的贫血→充血重构实录(第103篇)
golang·agent·ddd·领域驱动设计·eino·deepflux·eino adk
用户233376852181 小时前
Ubuntu上fpm多架构打包实战
后端
lsylalalala1 小时前
多线程(4)
java·开发语言·多线程