当前位置: 首页 > 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;只有理解了他的运行原理才能够真正的找到问题/漏洞所在。所以对于国内那些上来就说…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...