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)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35761.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)

文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1)对文件对象的信息的操作2)文件/文件夹的创建/删除3)⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例:2…

逻辑派G1 6层高速板学习

逻辑派G1 6层高速板学习 一、原理图分析二、电源分析三、网表导入四、板框导入五、PCB快捷键导入与设置六、模块抓取以及接口器件布局七、模块化布局--预布局(先放各模块中的大器件)1 HDMI模块布局2 MCU模块布局3 FPGA模块布局4 DDR3模块布局5 DCDC电源模…

图论——广度优先搜索实现

99. 岛屿数量 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。 输入描述 第一行包含两个整数 N, M,表示矩阵的行数和列数。 后续 N 行,每行…

PTS-G1K13M RF Generator 1kW / 13MHz User’s Manual 手侧

PTS-G1K13M RF Generator 1kW / 13MHz User’s Manual 手侧

应用分层简介

一、什么是应用分层 应用分层是一种软件开发设计思想,它将应用程序分为多个层次,每个层次各司其职,多个层次之间协同提供完整的功能,根据项目的复杂程度,将项目分为三层或者更多层。 常见的MCV设计模式,就…

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称,python后边的根据自己的需要,选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …

E902基于bash与VCS的仿真环境建立

网上看见很多E902仿真的文章,但用到的编译器是类似于这种Xuantie-900-gcc-elf-newlib-x86_64-V3.0.1-20241120,而我按照相应的步骤与对应的编译器,仿真总会报错。后面将编译器换成riscv64-elf-x86_64-20210512,反而成功了。现在开…

PostgreSQL:简介与安装部署

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

Git使用和原理(3)

1.远程操作 1.1分布式版本控制系统 我们⽬前所说的所有内容(⼯作区,暂存区,版本库等等),都是在本地!也就是在你的笔记本或者 计算机上。⽽我们的 Git 其实是分布式版本控制系统!什么意思呢&a…

ssm框架之mybatis框架讲解

1,Mybatis 1.1 Mybatis概述 1.1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发 MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2…

方法之笔,驭繁于简.绘场景之魂——方法论引领支撑透明化项目之航

关注作者 项目建设中痛难点剖析: 01 项目策划有缺失,目标风险难管控 ①目标设定不合理,由于项目移交交底不充分,造成项目建设目标与前期立项论证偏差过大,达不到建设预期; ②风险评估不足,未…

【Apache Storm】

一、Storm简介 1、概述 官网地址:https://storm.apache.org/index.html Apache Storm 是一个开源的、分布式的实时计算系统,专为处理流式数据而设计。它能够处理大量数据流并在极低的延迟下提供实时的结果。相比于传统的批处理系统,Storm 具…

【力扣刷题实战】无重复的最长字串

大家好,我是小卡皮巴拉 文章目录 目录 力扣题目: 无重复的最长字串 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C) 兄弟们共勉 !!! 每篇前言 博客主页&#x…

联想扬天M590台式机开机卡LOGO不引导故障维修案例分享

故障描述: 用户送修联想扬天M590台式机到站端维修,说是开机不能正常进系统;站端检测开机后卡LOGO、无法加载引导系统; 故障检修: 插拔内存、插拔硬盘,更换内存、更换硬盘均不能解决此故障;调试…

C++刷题(三):string

📝前言说明: 本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C。 每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…

PosterRender 实现微信下程序 分享商品生成海报

PosterRender 是什么 PosterRender 是一种专注于生成高质量海报图像的技术或工具,常用于生成静态图片,特别是适合用于营销、宣传和展示的图形设计。它通常用于在服务端或客户端渲染复杂的图像,包括文字、图形、图标、背景等,生成…

Spring Cloud Stream - 构建高可靠消息驱动与事件溯源架构

一、引言 在分布式系统中,传统的 REST 调用模式往往导致耦合,难以满足高并发和异步解耦的需求。消息驱动架构(EDA, Event-Driven Architecture)通过异步通信、事件溯源等模式,提高了系统的扩展性与可观测性。 作为 S…

Houdini制作非均匀细分的柱体

近期看见一非均匀细分的做法,觉得不错将其拆开以笔记分享。效果如下: 1.创建Geometry节点,并在该节点内部创建line节点样条线,设置合适长度并添加resample节点。 2.此时若无法看见顶点与顶点编号显示,可按快捷键D&am…

C# Unity 唐老狮 No.10 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中,堆和…

Nuxt2 vue 给特定的页面 body 设置 background 不影响其他页面

首先认识一下 BODY_ATTRS 他可以在页面单独设置 head () {return {bodyAttrs: {form: form-body}};},设置完效果是只有这个页面会加上 接下来在APP.vue中添加样式