当前位置: 首页 > news >正文

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

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

核心概念
  1. 语法特性...T 表示函数可接受任意数量的T类型参数
  2. 底层实现:不定长参数在函数内部实际存储为切片类型 []T
  3. 展开操作符:调用时使用 slice... 可将切片展开为独立参数
函数定义对比
// 不定长参数形式
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. 参数位置:不定长参数必须是函数的最后一个参数

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

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

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

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

    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{}):

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

    // 将普通切片转换为不定长参数
    intSlice := []int{1, 2, 3}
    hello(intSlice...)  // 等效于 hello(1, 2, 3)
    

相关文章:

  • 【蓝桥杯】第十三届C++B组省赛
  • 删除排序链表中的重复元素(js实现,LeetCode:83)
  • 解决远程卡在下载vscode-server的问题,一键安装脚本
  • 网站搭建(node.js安装后hexo无法安装的修复步骤)
  • C语言之数据结构:链表
  • 嵌入式硬件篇---龙芯UART通信
  • vscode使用ssh同时连接主机CentOS:user和ubuntu20.04:docker
  • MATLAB 2024b深度学习新特性全面解析与DeepSeek大模型集成开发
  • vue:组件的使用
  • Qt 实操记录:打造自己的“ QQ 音乐播放器”
  • Pycharm接入DeepSeek,提升自动化脚本的写作效率
  • 【css酷炫效果】纯CSS实现故障文字特效
  • 设计模式(创建型)-单例模式
  • 【前端面试题】闭包和其应用
  • 安卓apk加固后,Android11+无法安装
  • 在NET6项目中报错,未能在命名空间System.Data.SqlClient中找到类型名SqlCommand,解决办法
  • 一次由IDEA配置引发的Redis连接问题
  • 区块链赋能:用Python开发去中心化投票系统
  • 清晰易懂的Node.js安装教程
  • 五种方案实现双链路可靠数据传输
  • 年轻人的事业!6家上海人工智能企业畅想“模范生”新征程
  • 气候资讯|4月全球前沿气候科学研究&极端天气气候事件
  • 邮储银行一季度净赚超252亿降逾2%,营收微降
  • 人社部:一季度全国城镇新增就业308万人,同比增加5万人
  • 首映|“凤凰传奇”曾毅:拍电影,我是认真的
  • 比熬夜更伤肝的事,你可能每天都在做