Go 和 Delphi 定义可变参数函数的对比

使用可变参数函数具有灵活性、重用性、简化调用等优点,各个语言有各自定义可变参数函数的方法,也有通用的处理方法,比如使用数组、定义参数结构体、使用泛型等。

这里总结记录一下 go、delphi 的常用的定义可变参数函数的方式!

一、Go 定义可变参数函数

  • 定义方式:在类型前面加上省略号(...),如果将可变参数定义为 ...interface{} 类型,则可传递任意类型的值给函数
  • 代码示例:
package main  import (  "fmt"  
)  // 定义一个带有可变参数sum的函数  
func sum(numbers ...int) int {  total := 0  for _, num := range numbers {  total += num  }  return total  
}  func main() {  // 调用sum函数并传入可变数量的参数  fmt.Println(sum(1, 2, 3)) // 输出: 6  // 也可以通过一个切片来传递参数  numbers := []int{5, 6}  fmt.Println(sum(numbers...)) // 输出: 11  
}

可变参数定义为 ...interface{} 类型:

package main  import (  "fmt"  
)  func printValues(values ...interface{}) {  for _, value := range values {  switch v := value.(type) {  case int:  fmt.Println(v, "is an int")  case string:  fmt.Println(v, "is a string")  default:  fmt.Println(v, "is of a different type")  }  }  
}  func main() {  printValues(1, "two", 3.0)  
}
  • 注意事项:

①可变参数必须是函数参数列表中的最后一个参数

②调用函数传入切片时,需要在切片后加(...),否则只会将切片本身作为一个单独的参数传递给函数,而不是切片中的元素

③用 ...interface{}作为参数类型时,需使用类型断言来处理不同的类型

二、Delphi 定义可变参数函数

  • 定义方式:使用数组(array of const),结合 TVarRec 结构体判断参数类型
  • 代码示例:
type//定义一个简单的类,用来作为测试可变参数函数的其中一个参数TPerson = classprivatename: string;end;//定义该函数的参数为可变参数
procedure PrintMultipleParams(args: array of const);//可变参数函数的实现部分
procedure PrintMultipleParams(args: array of const);
vari: integer;sInfo: string;
beginsInfo := '';for i := Low(args) to High(args) dobegin// 通过 TVarRec().VType 判断参数的类型, TVarRec(args[i]).VInteger 取值case TVarRec(args[i]).VType ofvtInteger:sInfo := sInfo + '整形值: ' + IntToStr(TVarRec(args[i]).VInteger) + #13#10;vtUnicodeString:sInfo := sInfo + '字符串: ' + string(TVarRec(args[i]).VString) + #13#10;vtObject:  // 这里假定确定类为 TPerson ,获取 person.namesInfo := sInfo + '类名: ' + TVarRec(args[i]).VObject.ClassName + ' -- '+ TPerson(TVarRec(args[i]).VObject).name+ #13#10;elsesInfo := sInfo + ' -- 不支持的类型';end;end;ShowMessage(sInfo);
end;//调用可变参数函数
procedure TForm1.btn1Click(Sender: TObject);
varperson: TPerson;
begin// 传递 3 个参数PrintMultipleParams([1, '测试可变参数', 3]);// 传递 4 个参数PrintMultipleParams([1, '测试可变参数', 3, '中国']);// 传递 2 个参数person := TPerson.Create;tryperson.name := '可变参数是 TObject';PrintMultipleParams([1, person]);finallyFreeAndNil(person);end;
end

测试结果:

  • 注意事项:

TVarRec 是 Delphi 中用于表示一个记录的类型,该记录有一个可以保存多种值的变体部分。这些值可以包括整数、布尔、字符、实数、字符串、指针、类、类引用、接口、变体等。

VType 字段用于表示记录值的类型,对应的值分别用 VInteger、VString、VObject等获取。

delphi 中 TVarRec 的定义如下:

  TVarRec = record { do not pack this record; it is compiler-generated }case Integer of0: (case Byte ofvtInteger:       (VInteger: Integer);vtBoolean:       (VBoolean: Boolean);
{$IFNDEF NEXTGEN}vtChar:          (VChar: _AnsiChr);
{$ENDIF !NEXTGEN}vtExtended:      (VExtended: PExtended);
{$IFNDEF NEXTGEN}vtString:        (VString: _PShortStr);
{$ENDIF !NEXTGEN}vtPointer:       (VPointer: Pointer);
{$IFNDEF NEXTGEN}vtPChar:         (VPChar: _PAnsiChr);
{$ENDIF !NEXTGEN}
{$IFDEF AUTOREFCOUNT}vtObject:        (VObject: Pointer);
{$ELSE}vtObject:        (VObject: TObject);
{$ENDIF}vtClass:         (VClass: TClass);vtWideChar:      (VWideChar: WideChar);vtPWideChar:     (VPWideChar: PWideChar);
{$IFNDEF NEXTGEN}vtAnsiString:    (VAnsiString: Pointer);
{$ENDIF !NEXTGEN}vtCurrency:      (VCurrency: PCurrency);vtVariant:       (VVariant: PVariant);vtInterface:     (VInterface: Pointer);vtWideString:    (VWideString: Pointer);vtInt64:         (VInt64: PInt64);vtUnicodeString: (VUnicodeString: Pointer););1: (_Reserved1: NativeInt;VType:      Byte;);end;

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

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

相关文章

基于图卷积网络的人体3D网格分割

深度学习在 2D 视觉识别任务上取得了巨大成功。十年前被认为极其困难的图像分类和分割等任务,现在可以通过具有类似人类性能的神经网络来解决。这一成功归功于卷积神经网络 (CNN),它取代了手工制作的描述符。 NSDT工具推荐: Three.js AI纹理开…

1301-习题1-1高等数学

1. 求下列函数的自然定义域 自然定义域就是使函数有意义的定义域。 常见自然定义域: 开根号 x \sqrt x x ​: x ≥ 0 x \ge 0 x≥0自变量为分式的分母 1 x \frac{1}{x} x1​: x ≠ 0 x \ne 0 x0三角函数 tan ⁡ x cot ⁡ x \tan x \cot x …

C++奇迹之旅:vector使用方法以及操作技巧

文章目录 📝前言🌠 熟悉vector🌉使用vector 🌠构造函数🌉vector遍历 🌠operator[]🌉迭代器 🌠Capacity容量操作🌉 size()🌉 capacity()🌉resize()…

C语言中的七种常用排序

今天&#xff0c;为大家整理了C语言中几种常用的排序&#xff0c;以及他们在实际中的运用&#xff08;有Bug请在下方评论&#xff09;&#xff1a; 一.桶排序 #include <stdio.h> int main() {int book[1001],i,j,t,n;for(i0;i<1000;i)book[i]0;scanf("%d"…

二进制中1的个数c++

题目描述 计算鸭给定一个十进制非负整数 NN&#xff0c;求其对应 22 进制数中 11 的个数。 输入 输入包含一行&#xff0c;包含一个非负整数 NN。(N < 10^9) 输出 输出一行&#xff0c;包含一个整数&#xff0c;表示 NN 的 22 进制表示中 11 的个数。 样例输入 100 …

001集—创建、写入、读取文件fileopen函数——vb.net

此实例为在指定路径下创建一个txt文本文件&#xff0c;在文本文件内输入文字&#xff0c;并弹窗显示输入文字&#xff0c;代码如下&#xff1a; Public Class Form1Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickDim testcontent As Str…

英语学习笔记26——Where is it?

Where is it? 它在那里&#xff1f; 课文部分

springboot+vue+mybatis校园兼职平台+PPT+论文+讲解+售后

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个学生的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要…

opencv进阶 ——(五)图像处理之马赛克

一、遍历图像并对每个马赛克区域进行像素化处理 for (int y 0; y < image.rows; y blockSize) {for (int x 0; x < image.cols; x blockSize) {cv::Rect rect cv::Rect(x, y, std::min(blockSize, image.cols - x), std::min(blockSize, image.rows - y));cv::Scal…

新建一个STM32工程(精简版)

一、新建一个STM32工程 二、建立三个文件夹 1、Start文件夹里的东西 &#xff08;1&#xff09;启动文件&#xff1a;STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm &#xff08;2&#xff09;STM32…

005、API_数据结构

键的数据结构类型&#xff0c;它们分别是&#xff1a; string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集 合&#xff09;&#xff0c;这些只是Redis对外…

从0开始学统计-蒙彼利埃尔悖论与条件概率

1.什么叫均衡可比&#xff1f; "均衡可比"指的是在进行比较时&#xff0c;确保所比较的对象或情况具有相似的特征和条件&#xff0c;以保持比较的公正性和准确性。这个概念通常应用于研究设计和数据分析中&#xff0c;以确保比较结果的可信度和有效性。 在研究中&a…

P6160 [Cnoi2020] 向量

[Cnoi2020] 向量 题目背景 向量(vector)&#xff0c;指具有大小(Magnitude)和方向(Direction) 的量。 与向量对应的量叫做数量(Scalar)&#xff0c;数量只有大小&#xff0c;没有方向。 对于 Cirno 来说&#xff0c;整天环绕氷屋的旋转 Sangetsusei 们是向量而不是数量。 Sun…

【JavaSE】/*类和对象(上)*/

目录 一、什么是类&#xff0c;什么是对象 二、类和对象的关系 三、学习类和对象的目的 四、怎样创建一个类 4.1 语法形式 4.2 创建示例 示例一&#xff1a;日期对象 示例二&#xff1a;小狗对象 示例三&#xff1a;学生对象 4.3 注意事项 4.4 修改public修饰的主类…

信号量——多线程

信号量的本质就是一个计数器 在多线程访问临界资源的时候&#xff0c;如果临界资源中又有很多份分好的资源&#xff0c;那么就可以通过信号量来表示里面还有多少份资源&#xff0c;且每份资源只有一个线程可以访问 线程申请信号量成功&#xff0c;就一定有一份资源是你的&…

python机器学习及深度学习在空间模拟与时间预测

原文链接https://mp.weixin.qq.com/s?__bizMzUyNzczMTI4Mg&mid2247628504&idx2&sn6fe3aeb9f63203cfe941a6bb63b49b85&chksmfa77a9e5cd0020f3aa4f01887e75b15096a182c2b5b42c1044787aa285c650f1469a0ef28aec&token2124656491&langzh_CN&scene21#we…

网络模型—BIO、NIO、IO多路复用、信号驱动IO、异步IO

一、用户空间和内核空间 以Linux系统为例&#xff0c;ubuntu和CentOS是Linux的两种比较常见的发行版&#xff0c;任何Linux发行版&#xff0c;其系统内核都是Linux。我们在发行版上操作应用&#xff0c;如Redis、Mysql等其实是无法直接执行访问计算机硬件(如cpu&#xff0c;内存…

勒索软件分析_Conti

0. Conti介绍 勒索软件即服务&#xff08;Ransomware as a Service&#xff0c;RaaS&#xff09;变体 Conti 推出还不到两年&#xff0c;已经进行了第七次迭代。Conti被证明是一种敏捷而熟练的恶意软件威胁&#xff0c;能够自主和引导操作&#xff0c;并具有无与伦比的加密速度…

详细分析Element中的Drawer(附Demo)

目录 前言1. 基本知识2. Demo2.1 基本用法2.2 不同方向2.3 自定义大小2.4 嵌入表单2.5 嵌套抽屉 3. 实战4. Element Plus&#xff08;Drawer&#xff09; 前言 对于该组件针对Vue2比较多&#xff0c;而Element Plus中的Drawer针对Vue3比较多 此处的Demo主要偏向Vue2 后续的El…

探索 Mistral 新发布的具有原生函数调用功能的 7B 模型【附notebook文件】

引言 Mistral 发布了新版的 7B 模型&#xff0c;这次更新引入了原生函数调用功能。对于开发者和 AI 爱好者来说&#xff0c;这一更新极具吸引力&#xff0c;因为它增强了模型的功能和实用性。在这篇博客中&#xff0c;我们将深入探讨这些新功能&#xff0c;展示如何使用该模型…