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

Go基础-可变参数函数

文章目录

  • 1 定义
  • 2 语法
  • 3 给可变函数参数传入切片
  • 4 修改可变参数函数中的切片

1 定义

可变参数函数是一种参数个数可变的函数。

2 语法

语法

//关键字 函数名(参数1, elems为T类型的可变参数) 返回值类型
func name(params type, elems ...T) returntype{// 函数体
}

slice的append就是一个可变参数的内部函数

func append(slice []Type, elems ...Type) []Type

可变参数示例1

package mainimport "fmt"func find(target int, group ...int) int {ishit := falseindex := 0for i, v := range group {if target == v {fmt.Printf("找到元素值:%d,在索引位置:%d\n", v, i)ishit = trueindex = i}}if !ishit {return -1} else {return index}}func main() {find(7, 1, 2, 3, 4, 5)
}

可变参数示例2

package mainimport "fmt"func add(base int, group ...int) {total := 0for _, v := range group {total += v}total += basefmt.Println("total = ", total)
}func main() {add(100, 1, 2, 3, 4, 5)
}

可变参数函数的工作原理是把可变参数转换为一个新的切片,然后被传入函数中。

3 给可变函数参数传入切片

package mainimport "fmt"func find(a int, elems ...int) {for i, v := range elems {if v == a {fmt.Printf("found value %d, at index %d", v, i)break}}
}func main() {a := []int{1, 2, 3, 4, 5}find(1, a)  // cannot use a (type []int) as type int in argument to find}

将切片直接传递给可变参数明显是不可以的,但是可以通过一个语法糖解决这个问题。

将切片传入函数的可变参数位置报错的原因分析

多变参数,将接收到的参数做为一个切片,如果直接传递一个切片会出现下面这种情况:

// 1 函数原型 
func find(a int, elems ...int) // 2 函数参数 为切片a 传递到find 等同于 []int{a} 
// 因为切片要求的元素类型为int,传入的确是一个[]int,所以报错
cannot use a (type []int) as type int in argument to find
// 3 go给出的报错信息很友好

如何能够将切片直接传递给可变参数函数?
有一个可以直接将切片传入可变参数函数的语法糖,你可以在在切片后加上 … 后缀。如果这样做,切片将直接传入函数,不再创建新的切片

修改上面的函数


package mainimport "fmt"func find(a int, elems ...int) {for i, v := range elems {if v == a {fmt.Printf("found value %d, at index %d", v, i)break}}
}func main() {a := []int{1, 2, 3, 4, 5}find(1, a...) // cannot use a (type []int) as type int in argument to find}

4 修改可变参数函数中的切片

如果使用切片…,那么会将切片直接传递给函数,不会再创建新的切片,这也意味着,如果再可变参数函数内部修改了切片,会影响到创建切片的位置,这可能比较抽象,直接看一个例子就好了。

示例一

package mainimport "fmt"func changeTest(s ...string) {s[0] = "上树捉鸟"s[1] = "下河洗澡"
}func main() {s := []string{"好好学习", "天天向上"}fmt.Println("传递前: ", s)changeTest(s...) // 将切片传递过去,changeTest不会再创建切片fmt.Println("传递后: ", s)
}

示例一执行结果:

传递前:  [好好学习 天天向上]
传递后:  [上树捉鸟 下河洗澡]

示例2

package mainimport "fmt"func changeTest1(s ...string) {s[0] = "上树捉鸟"s[1] = "下河洗澡"s = append(s, "窈窕淑女", "君子好逑")fmt.Println("in changeTest: ", s)
}func main() {s := []string{"好好学习", "天天向上"}fmt.Println("传递前: ", s)changeTest1(s...) // 将切片传递过去,changeTest不会再创建切片fmt.Println("传递后: ", s)
}

示例2执行结果:

传递前:  [好好学习 天天向上]
in changeTest:  [上树捉鸟 下河洗澡 窈窕淑女 君子好逑]
传递后:  [上树捉鸟 下河洗澡]

相关文章:

Go基础-可变参数函数

文章目录1 定义2 语法3 给可变函数参数传入切片4 修改可变参数函数中的切片1 定义 可变参数函数是一种参数个数可变的函数。 2 语法 语法 //关键字 函数名(参数1, elems为T类型的可变参数) 返回值类型 func name(params type, elems ...T) returntype{// 函数体 }…...

kali环境搭建

一、渗透为什么要使用kali? 1、系统开源 kali linux实际上是开源的操作系统,其中内置了几百种工具而且是免费的,可以非常方便的为测试提供上手即用的整套工具,而不需要繁琐的搭建环境,及收集工具下载安装等步骤 2、系统…...

电子技术——输出阶类型

电子技术——输出阶类型 输出阶作为放大器的最后一阶,其必须有较低的阻抗来保证较小的增益损失。作为放大器的最后一阶,输出阶需要处理大信号类型,因此小信号估计模型不适用于输出阶。尽管如此,输出阶的线性也非常重要。实际上&a…...

C++设计模式(21)——中介者模式

亦称: 调解人、控制器、Intermediary、Controller、Mediator 意图 中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。 问题 假如你有一个创建…...

Gin获取Response Body引发的OOM

有轮子尽量用轮子 😭 😭 😭 😭 😭 😭 我们在开发中基于Gin开发了一个Api网关,但上线后发现内存会在短时间内暴涨,然后被OOM kill掉。具体内存走势如下图: 放大其中一次 在…...

不同方案特性对比

特性对比项 2.4G 蓝牙 868M WIFI 通信速率 低 低 低 高 距离(实用可靠) 20米 10米 30米 15米 确定性 高 低 高 高 可靠性(距离内) 高 低 高 高 刷新一个标签时间(通常) 0.5-1s …...

线性数据结构:链表 LinkList

一、前言 链表的历史 于1955-1956年,由兰德公司的Allen Newell、Cliff Shaw和Herbert A. Simon开发了链表,作为他们的信息处理语言的主要数据结构。链表的另一个早期出现是由 Hans Peter Luhn 在 1953 年 1 月编写的IBM内部备忘录建议在链式哈希表中使…...

对restful的支持 rust-grpc-proxy

目录前言快速体验说明1. 启动目标服务2. 启动代理3. 测试4. example.sh尾语前言 继上一篇博文的展望,这个月rust-grpc-proxy提供了对restful的简单支持。 并且提供了完成的用例,见地址如下, https://github.com/woshihaoren4/grpc-proxy/tre…...

【模拟集成电路】环路滤波器(LPF)设计

环路滤波器 LPF 设计 前言环路滤波器设计仿真结果各部分链接链接:前言 本文主要内容是对环路滤波器 模块设计设计进行阐述,LPF在电荷泵频率综合器中,主要作用是进行滤波,消除毛刺,因此一个简单的RC就可以起到很好的效果…...

adb及cmd部分常用命令

adb及cmd部分常用命令cmd常用命令adb常用命令内存/cpu相关此文章日常记录,有可能存在不准确的地方,仅供参考即可。 cmd常用命令 返回上一级: cd… 进入指定盘: D: 进入指定路径: cd 文件路径 查看子文件列表&#xf…...

ProtoBuf介绍

1 编码和解码编写网络应用程序时,因为数据在网络传输的都是二进制字节码数据,在发送数据时进行编码,在接受数据时进行解码codec(编码器)的组成部分有2个:decoder(解码器)和encoder&a…...

数据结构:完全二叉树开胃菜小练习

目录 一.前言 二.完全二叉树的重要结构特点 三.完全二叉树开胃菜小练习 1.一个重要的数学结论 2.简单的小练习 一.前言 关于树及完全二叉树的基础概念(及树结点编号规则)参见:http://t.csdn.cn/imdrahttp://t.csdn.cn/imdra 完全二叉树是一种非常重要的数据结构: n个结点的…...

mybatis与jpa

1、官方文档 mybatis:mybatis-spring – jpa:https://springdoc.cn/spring-data-jpa/ 应用文档 jpa详解_java菜鸟1的博客-CSDN博客 JPA简介及其使用详解_Tourist-xl的博客-CSDN博客_jpa的作用 2、使用比较 mybatis一般用于互联网性质的项目&#x…...

js 求解《初级算法》66. 加一

一、题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入&#xff1a…...

力扣-游戏玩法分析

大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:511. 游戏玩法分析二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总结…...

ZZNUOJ_用C语言编写程序实现1186 : 奖学金(结构体专题)(附完整源码)

题目描述 某校发放奖学金共5种,获取条件各不同: 1.阳明奖学金,每人8000,期末平均成绩>80,且在本学期发表论文大于等于1篇; 2.梨洲奖学金,每人4000,期末平均成绩>85,且班级评议成绩>80; 3.成绩优秀奖,每人2000,期末平均成绩>90; 4.西部奖学金,…...

加油站ai系统视频监测 yolov5

加油站ai系统视频监测通过yolov5网络模型深度学习边缘计算技术,加油站ai系统视频监测对现场卸油过程中人员违规离岗、现场灭火器没有按要求正确摆放、以及卸油前需要遵守静电释放15分钟、打电话、明火烟雾情况、抽烟行为进行自动识别。YOLO系列算法是一类典型的one-…...

【JDK8新特性之Stream流-Stream结果收集案例实操】

一.JDK8新特性之Stream流-Stream结果收集以及案例实操 二.Stream结果收集(collect函数)-实例实操 2.1 结果收集到集合中 /*** Stream将结果收集到集合中以及具体的实现 collect*/Testpublic void test01(){// 收集到List中 接口List<Integer> list Stream.of(1, 2, 3…...

Fiddler 抓包工具

HTTP代理所谓的http代理&#xff0c;其实就是代理客户机的http访问&#xff0c;主要代理浏览器访问页面。代理服务器是介于浏览器和web服务器之间的一台服务器&#xff0c;有了它之后&#xff0c;浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求&#xff0c;Requ…...

2023最新版网络安全保姆级指南,手把手带你从零基础进阶渗透攻防工程师

前言 一份网络攻防渗透测试的学习路线&#xff0c;不藏私了&#xff01; 1、学习编程语言(phpmysqljshtml) 原因&#xff1a; phpmysql可以帮助你快速的理解B/S架构是怎样运行的&#xff0c;只有理解了他的运行原理才能够真正的找到问题/漏洞所在。所以对于国内那些上来就说…...

mpv.net:Windows平台最强大的开源媒体播放器解决方案

mpv.net&#xff1a;Windows平台最强大的开源媒体播放器解决方案 【免费下载链接】mpv.net &#x1f39e; mpv.net is a media player for Windows with a modern GUI. 项目地址: https://gitcode.com/gh_mirrors/mp/mpv.net 在Windows平台上寻找一款既强大又简洁的媒体…...

宏裕塑胶携手沙伯基础创新塑料,打造高端工程塑料解决方案

导读&#xff1a;在制造业转型升级的关键节点&#xff0c;高端工程塑料解决方案正成为企业提升产品竞争力的核心要素。宏裕塑胶携手沙伯基础创新塑料&#xff0c;打造高端工程塑料解决方案&#xff0c;通过整合国际顶尖原料资源与本土技术服务能力&#xff0c;为下游企业提供兼…...

第十章:什么是Agentic AI?——让AI从“回答问题“到“替你办事“

难度级别:★★★★☆ | 预计阅读时间:15分钟 你将学到:Agentic AI的核心能力、技术架构、主流框架对比、PM选型决策框架、以及如何设计一个AI Agent系统 引言:从"工具"到"代理"的跨越 一个真实的痛点 某科技公司的研究员小王,每天需要花3小时完成以…...

用 ai 生成带货/电商短视频,有哪些工具比较好用?下面推荐几个

在 2026 年&#xff0c;短视频内容已成为驱动电商转化的核心引擎。然而&#xff0c;许多商家仍面临本土化适配难、制作周期长、精品成本高等痛点。本文将针对“怎么用 ai 生成带货视频&#xff0c;有哪些工具比较好用&#xff1f;”以及“AI 生成电商短视频的工具有哪些&#x…...

基于 PyTorch 的 TransU-Net 模型进行不同城市建筑物的精准提取 来继续遥感图像语义分割

基于 PyTorch 的 TransU-Net 模型进行不同城市建筑物的精准提取 来继续遥感图像语义分割 遥感图像语义分割&#xff0c;遥感建筑物数据集&#xff0c;基于Pytorch框架&#xff0c;针对不同城市建筑物精准提取。 遥感图像中包含丰富的地理空间信息&#xff0c;从遥感图像中了…...

抖音批量下载器终极指南:3步轻松搞定无水印视频下载

抖音批量下载器终极指南&#xff1a;3步轻松搞定无水印视频下载 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

戴尔G15散热终极控制:开源TCC-G15高效替代方案完全指南

戴尔G15散热终极控制&#xff1a;开源TCC-G15高效替代方案完全指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 对于戴尔G15笔记本用户而言&#xff0c;过热…...

抖音批量下载终极指南:免费高效获取无水印视频与音乐

抖音批量下载终极指南&#xff1a;免费高效获取无水印视频与音乐 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

MPV_lazy:Windows用户必备的终极视频播放体验提升指南

MPV_lazy&#xff1a;Windows用户必备的终极视频播放体验提升指南 【免费下载链接】mpv_PlayKit &#x1f504; mpv player 播放器折腾记录 Windows conf | 中文注释配置 汉化文档 快速帮助入门 | mpv-lazy 懒人包 Win11 x64 config | 着色器 shader 滤镜 filter 整合方案 项…...

遥感影像分割选哪个?eCognition里8种方法(棋盘、多尺度、分水岭...)的实战避坑指南

遥感影像分割实战指南&#xff1a;eCognition八大算法深度解析与选型策略 1. 遥感影像分割的技术演进与核心挑战 在数字地球时代&#xff0c;高分辨率遥感影像已成为地理信息提取的重要数据源。与传统基于像素的分类方法相比&#xff0c;面向对象影像分析&#xff08;OBIA&am…...