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

GO 语言如何用好变长参数?

函数重载

对于函数重载相信编码过的 xdm 肯定不会陌生,函数重载就是在同一个作用域内定义多个具有相同名称但参数列表不同的函数

此处的参数列表不同,可以是参数的类型不同,参数的个数不同

那么我们一起分别来看看 C 语言,C++ 语言,GO 语言 如何去模拟和使用重载,体会一下

C语言模拟重载

那么我们以前学过的 C 语言,是不支持重载的,是不会自动根据参数类型来进行匹配的,但是我们可以通过一些技巧来模拟函数重载,例如我们可以定义一类名字相似的函数,参数列表来模拟重载的效果

例如:

  1. 定义函数 sum_int ,参数为 2 个 int 类型的变量
  2. 定义函数 sum_double ,参数为 2 个 double 类型的变量
  3. 定义函数 sum_float ,参数为 2 个 float 类型的变量
int sum_int(int x, int y) {return x + y;
}double sum_int(double x, double y) {return x + y;
}float sum_int(float x, float y) {return x + y;
}

那么在调用的时候,我们就会根据不同的入参类型来调用对应的函数

C++ 重载

又如我们写 C++ 的时候,这个语言是支持重载的,我们可以在调用函数的时候,传入不同的参数类型,不同的参数个数来决定我们需要调用哪个函数的具体实现,我们来看看如何来使用重载

例如:

  1. 定义一个函数 getinfo ,参数为 int 类型的变量
  2. 还是 getinfo 函数,参数为 double 类型的变量
  3. 还是 getinfo 函数,参数为 string 类型的变量
void getinfo (int x) {std::cout << "int 类型入参: " << x << std::endl;
}void getinfo (double x) {std::cout << "double 类型入参: " << x << std::endl;
}void getinfo (std::string x) {std::cout << "std::string 类型入参: " << x << std::endl;
}

使用 C++ 的时候,我们可以看到,使用同一个函数,咱们直接就可以传入不同类型的入参,来应用重载

GO语言模拟重载

那么,GO 语言本身也是不允许重载的,因为GO语言的设计理念就是简洁和易读,这样可以避免代码的复杂和可维护性

不过我们在使用的时候,为了我们实现我们不同的业务场景,可以使用GO 语言中的变长参数来进行模拟

例如:

  1. 定义一个函数 overloadTest,参数为一个变长参数,参数类型为 …interface{}
  2. 那么,对于这个函数,我们参数个数和参数类型,都可以按照我们的需求进行传递即可
func overloadTest(name string, hobby ...interface{}){for _,v :=range hobby {switch v.(type) {case int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64:fmt.Printf("%s love 整数  -- %+v \n",name, v)case string:fmt.Printf("%s love 字符串 -- %+v \n",name, v)case []int:tmpInts := v.([]int)fmt.Printf("%s love 整型切片 -- %+v \n",name, tmpInts)default:fmt.Printf("%s  not love type  -- %+v \n",name, v)}}
}func main(){overloadTest("xiaozhu", "learning", "playing")overloadTest("xiaozhu", []int{1,2,3,4})overloadTest("xiaozhu", map[string]int{"apple":2000})overloadTest("xiaozhu", 100)}

可以看到 GO 语言公共库中使用变长参数的地方还是非常多的,例如打印相关的

fmt 包中的 Printf

fmt 包中的 Println

还有我们使用切片时经常使用的 append 函数

使用变长参数的的场景还是不少的,可以多留意咱们的公共库,用起来也是非常的方便,我们需要对变长参数的设计和实现要有更多的理解,用起来才能够得心应手

GO 语言中的变长参数

对于 GO 语言中的变长参数定义为:函数调用时指可以接受 0 个,1 个或者多个实际参数的函数

此处的定义,是否看上去和重载的定义稍微相似呢?

例如上述的 GO 语言的demo,给函数中传入变长参数的时候,我们就是在参数列表中写入 ...T ,那么很明显,一个函数中只能有一个这样的边长参数,且这个参数需要放到参数列表的最后一个

否则 GO 语言就不知道你传入的哪一些参数是属于变长参数的入参值了,xdm 们可以思考一下,如果这个变长参数放到参数列表的开头,或者参数列表的中间,那么我们在传递参数的时候,如何去识别呢?

我们可以来实际演示一波:

  1. 定义一个函数,变长参数列表类型为 string,且放到参数列表最后
  2. 同样的函数,将变长参数列表放到第一个
  3. 同样的函数,将变长参数列表放到第二个

这里实际上可以看到,变长参数的本质实际上就是一个切片类型的实例,函数内部实现,就是将这个参数作为切片来进行处理的,这也得益于切片的长度不是固定的

这里需要注意的一点:

函数定义了变长参数,我们在传递的时候可以一个一个的传,也可以使用切片变量后加… 的方式来传递,但是这两种传递方式不能混合使用,只能取其一

如何实现参数可选和默认参数呢?

思考一下,变长参数我们知道如何使用了,如何实现默认参数和可选参数呢?

实际上就是咱们在实现的时候,在函数内部控制我们需要必须传递的可选参数(实际是切片类型)最小的长度,或者最大的长度,然后去读取相应位置的值即可

这一点 xdm 感兴趣的可以参考上述 GO 语言demo 来实现一下默认参数和可选参数哦,通过去校验变长参数的长度,数据类型就可以做到这一点,可以在评论区留下的 demo 哦

还记得 grpc 中的功能选项模式吗?

在 GO 语言中,微服务的开发相信我们使用的不会少,那么在使用 grpc 通信的时候,我们就可以发现处理 rpc 接口的时候,我们是可以传递拦截器的,这个参数,就是功能选项模式

我们可以仿照它弄一个我们自己的功能选项模式:

现在汽车打价格战,疯狂的卖车,我们就用给车加选装来作为例子来体验选项模式的实现:

  1. 定义一台车,属性有颜色,座椅,品牌,风格,能源 其中部分配置是选装,也可以不选
type ABINGCar struct{Brand stringStyle stringMarshmallowChair int   // 棉花糖座椅Color stringPower string
}
  1. 给选装的配置,写好对应的选项功能
type Option func(*ABINGCar)func WithStyle(style string)Option{return func(a *ABINGCar){a.Style = style}
}func WithMarshmallowChair(enable int)Option{return func(a *ABINGCar){a.MarshmallowChair = enable}
}func WithPower(power string)Option{return func(a *ABINGCar){a.Power = power}
}
  1. New 一台车出来,写一个 NewCar,加上选项功能
func NewCar(options ...Option) *ABINGCar{car := &ABINGCar{Color: "red",Brand: "abing brand",}for _,option := range options{option(car)}return  car
}
  1. 在 main 函数中,去买车,买不同的车,可以选装不同的配置,想咋选咋选

总结

本次主要分享了不同语言的重载和模拟重载的效果,GO 语言中如何用好边长参数,如何实现 选项功能模式,希望对你有点帮助

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~
可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

相关文章:

GO 语言如何用好变长参数?

函数重载 对于函数重载相信编码过的 xdm 肯定不会陌生&#xff0c;函数重载就是在同一个作用域内定义多个具有相同名称但参数列表不同的函数 此处的参数列表不同&#xff0c;可以是参数的类型不同&#xff0c;参数的个数不同 那么我们一起分别来看看 C 语言&#xff0c;C 语…...

怎么解决 Http 协议无状态?

一、Http 协议无状态的含义 1.1 有状态协议 常见的许多七层协议实际上是有状态的&#xff0c;例如 SMTP 协议&#xff0c;它的第一条消息必须是 HELO&#xff0c;用来握手&#xff0c;在 HELO 发送之前其他任何命令都是不能发送的&#xff1b;接下来一般要进行 AUTH 阶段&#…...

FlinkCDC for mysql to Clickhouse

完整依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.flink/flink-core --><dependency><groupId>org.apache.flink</groupId><artifactId>flink-core</artifactId><version>1.13.0</version>…...

沃通SSL证书服务多省区一体化政务服务平台

近年来&#xff0c;我国政务服务数字化水平不断提升&#xff0c;数字政府建设取得积极成效。依托全国一体化政务服务平台&#xff0c;政务服务效能不断提升&#xff0c;“一网通办”能力显著增强&#xff0c;为创新政府治理、优化营商环境提供了有力支撑。沃通SSL证书具备保护数…...

Linux程序地址

目录 一、定义 二、问题引出 三、虚拟地址和物理地址 &#xff08;一&#xff09;问题解释 &#xff08;二&#xff09;什么是进程地址空间 &#xff08;三&#xff09;为什么要有进程地址空间 一、定义 #include <stdio.h> #include <stdlib.h>//geten…...

华为OD k 对元素最小值(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

解决Unity打包时,Android SDK 报错问题

报错内容应该包括类似如下信息&#xff1a; CommandInvokationFailure: Failed to update Android SDK package list. java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtim…...

基于nodejs+vue 校园通勤车系统

但是管理好校园通勤车可视化又面临很多麻烦需要解决, 信息化已经成为主流,开发一个校园通勤车可视化系统小程序一方面的可能会更合乎时宜,困扰管理层的许多问题当中,校园通勤车 管理也是不敢忽视的一块。另一方面来说也可以提高在校园通勤车可视化管理方面的效率给相关管理人员…...

【JavaEE】Java多线程编程案例 -- 多线程篇(3)

Java多线程编程案例 1. 单例模式1.1 代码的简单实现1.2 懒汉模式的线程安全代码 2. 阻塞队列2.1 阻塞队列的概念2.2 使用库中的BlockingDeque2.3 模拟实现阻塞队列2.4 生产者消费者模型 3. 定时器3.1 概念3.2 使用库的定时器 - Timer类3.3 模拟实现定时器 4. 线程池4.1 概念4.2…...

axios发送常见请求方式以及拦截器的封装

一&#xff0c;常见请求 //1.get--传递paramsaxios.get("/test",{params:{}})//2.post--传递paramsaxios.post("/test",{},{params:{}}) //3.post--传递bodyaxios.post("/test",{name:""}) 二&#xff0c;封装请求拦截器 import ax…...

Apollo中的身份验证与授权:保护你的数据

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

斜率优化dp

f i min ⁡ ( a j − j i ) f_i\min(a_j - j \times i) fi​min(aj​−ji) 考虑变成点对 ( j , a j ) (j,a_j) (j,aj​)&#xff0c;则 f i Y j − X j i f_iY_j-X_ji fi​Yj​−Xj​i 令 i k , f i b ik, f_ib ik,fi​b&#xff0c;得 b Y j − X j k bY_j-X_jk b…...

华为OD 打印任务排序(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

最新Ai写作创作系统源码+Ai绘画系统源码+搭建部署教程+支持GPT4.0+支持Prompt预设应用+思维导图生成

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…...

FPGA【紫光语法】

寄存器数据类型&#xff1a; reg 默认为 1 bit wide&#xff0c;如果超过 1 bit&#xff0c;则需要 range declaration 设置 reg 的位宽integer 默认位宽为 32 bit&#xff0c;不允许有 range declarationtime 默认位宽为 64 bit&#xff0c;不允许有 range declarat…...

运维监控Zabbix部署

目录 运维监控Zabbix部署 1. 简介 2. 安装 ​编辑 2.1 安装前准备 - Mysql 2.2 安装Zabbix Server 和 Zabbix Agent 2.2.1 安装Zabbix yum库 2.2.2 安装Zabbix Server、前端、Agent 2.2.3 初始化Mysql数据库 2.2.4 为Zabbix Server配置数据库 2.2.5 配置Zab…...

vue与react,angular的区别

Vue.js 作为一个优秀的前端框架&#xff0c;方便前端开发者快速开发应用的前端&#xff0c;在实际项目中使用得比较普遍。 当然 Vue.js 也不是实际项目中唯一的前端框架&#xff0c;比较优秀的前端框架还有 React、AngularJS 和 Angular等。接下来就介绍一下 Vue.js 同这3个框架…...

水质分析仪MQTT应用案例

水质分析仪MQTT应用案例 一、公司介绍 某仪器股份有限公司&#xff0c;集研发&#xff0c;生产&#xff0c;销售于一体的水质分析仪器公司。产品主要包括PH/ORP分析仪&#xff0c;电导度分析仪&#xff0c;溶氧分析仪&#xff0c;离子浓度分析仪&#xff0c;浊度分析仪及重金…...

网络代理技术的护航与网络安全

在数字化时代&#xff0c;网络代理技术日益重要&#xff0c;不仅可维护网络安全&#xff0c;还能促进数据获取。本文深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫、HTTP协议中的应用&#xff0c;助您深刻了解这些技术。 1. Socks5代理&#xff1a;网络安全与多协议支持…...

大模型LLM相关面试题整理-PEFT

Prefix/Prompt-Tuning&#xff1a;在模型的输入或隐层添加 个额外可训练的前缀 tokens&#xff08;这些前缀是连续的伪 tokens&#xff0c;不对应真实的 tokens&#xff09;&#xff0c;只训练这些前缀参数&#xff1b; Adapter-Tuning&#xff1a;将较小的神经网络层或模块插入…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...