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 = class
  private
    name: string;
  end;

//定义该函数的参数为可变参数
procedure PrintMultipleParams(args: array of const);

//可变参数函数的实现部分
procedure PrintMultipleParams(args: array of const);
var
  i: integer;
  sInfo: string;
begin
  sInfo := '';
  for i := Low(args) to High(args) do
  begin
    // 通过 TVarRec().VType 判断参数的类型, TVarRec(args[i]).VInteger 取值
    case TVarRec(args[i]).VType of
      vtInteger:
        sInfo := sInfo + '整形值: ' + IntToStr(TVarRec(args[i]).VInteger) + #13#10;
      vtUnicodeString:
        sInfo := sInfo + '字符串: ' + string(TVarRec(args[i]).VString) + #13#10;
      vtObject:  // 这里假定确定类为 TPerson ,获取 person.name
        sInfo := sInfo + '类名: ' + TVarRec(args[i]).VObject.ClassName + ' -- '
          + TPerson(TVarRec(args[i]).VObject).name+ #13#10;
    else
      sInfo := sInfo + ' -- 不支持的类型';
    end;
  end;

  ShowMessage(sInfo);
end;

//调用可变参数函数
procedure TForm1.btn1Click(Sender: TObject);
var
  person: TPerson;
begin
  // 传递 3 个参数
  PrintMultipleParams([1, '测试可变参数', 3]);
  // 传递 4 个参数
  PrintMultipleParams([1, '测试可变参数', 3, '中国']);

  // 传递 2 个参数
  person := TPerson.Create;
  try
    person.name := '可变参数是 TObject';
    PrintMultipleParams([1, person]);
  finally
    FreeAndNil(person);
  end;
end

测试结果:

  • 注意事项:

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

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

delphi 中 TVarRec 的定义如下:

  TVarRec = record { do not pack this record; it is compiler-generated }
    case Integer of
      0: (case Byte of
            vtInteger:       (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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker安装MongoDB(Linux版)

文章目录 前言一、Docker环境的准备1.安装依赖2.安装Docker 二、使用Docker安装MongoDB1.mongo版本选取2.拉取合适的镜像3.宿主机创建MongoDB需要挂载的文件夹4.第一次无认证创建mongo用户5.启动需要认证的mongo容器 问题汇总总结 前言 本文章主要介绍在Centos系统&#xff0c…

delphi fmx 跨平台文件浏览器

很多人在找delphi fmx 开发的 android下的文件浏览器 现在她来了 支持android,ios android12 测试通过 代码: object Form1: TForm1Left = 0Top = 0Caption = Form1ClientHeight = 549ClientWidth = 340FormFactor.Width = 320FormFactor.Height = 480FormFactor.Dev…

【GDAL】GDAL库学习(C#版本)

1.GDAL 2.VS2022配置GDAL环境(C#) VS2022工具–NuGet包管理器–管理解决方案的NuGet程序包,直接安装GDAL包。 并且直接用应用到当前的控制台程序中。 找一张tiff格式的图片,或者用格式转换网站:https://www.zamzar.c…

Web前端开发技术、详细文章、(例子)html 列表、有序列表、无序列表、列表嵌套

目录 列表概述 列表类型与标记符号 无序列表 语法: 语法说明: 无序列表标记的 type 属性及其说明 代码解释 有序列表 基本语法 属性说明 1、列表 o1标记的属性 2、列表项li标记的属性 有序列表 o1标记的属性、值 代码解释 列表嵌套 基本…

【Qt】深入探索Qt主窗口与菜单栏:构建高效用户界面的实践指南

文章目录 前言1. 什么是Main Window?2. 详细了解一下其中的 菜单栏:2.1. 创建菜单栏2.2. 添加快捷键2.3. 添加子菜单2.4. 添加分割线2.5. 添加图标 3. 内存泄漏问题:总结 前言 在现代软件开发中,用户界面的设计对于提升用户体验至关重要。Q…

秀某动预约抢票脚本

秀某动预约抢票脚本 小白操作-仅供学习参考 主要流程和功能 初始化和配置变量: confirm_url 和 login_url: 分别存储登录和确认订单的URL。 wait_time: 用户输入的提前多少秒开始执行。 start_time: 开售时间。 DEBUG: 调试标志,用于控制脚本的行为。 浏览…

并网逆变器学习笔记9---VSG控制

参考文献:《新型电力系统主动构网机理与技术路径》 “构网技术一般包含下垂控制,功率同步控制,虚拟同步机控制,直接功率控制,虚拟振荡器控制 等。其中,虚拟同步机技术,即 VSG,因其物…

css扇形菜单动画效果

菜单组件 IntelligentAnalysis.vue 中间圆形区域可以换个图片 <template><div class"intel-analysis"><div class"info" :class"{ close-animation: !showMenu }"><div class"middle"></div><div cl…

协变(List泛型作为方法参数时的父类子类问题)

有段时间没搞.net的项目了&#xff08;没办法&#xff0c;谁让国内JAVA流行是事实&#xff09;。最近又回归.net&#xff08;哪里需要哪里搬~&#xff09;。 接收到需求后&#xff0c;一顿输出&#xff0c;结果…咦?编译失败??? 错误信息&#xff1a; CS1503:参数1:无法…

阿里云 EMR Serverless Spark 版开启免费公测

阿里云 EMR Serverless Spark 版是一款云原生&#xff0c;专为大规模数据处理和分析而设计的全托管 Serverless 产品。它为企业提供了一站式的数据平台服务&#xff0c;包括任务开发、调试、调度和运维等&#xff0c;极大地简化了数据处理的全生命周期工作流程。使用 EMR Serve…

win11安装MySQL

目录[-] 1. 1. 下载2. 2. 安装 参考文档&#xff1a;MySQL :: MySQL 8.4 Reference Manual 1. 下载 mysql官网下载msi安装程序&#xff1a;MySQL :: Begin Your Download 2. 安装 运行下载的mis程序,逐步安装。 安装模式&#xff1a; complete; 进入配置&#xff1a; data di…

轻量SEO分析报告程序网站已开心去授权

轻量SEO分析报告程序网站已开心去授权&#xff0c;可以让你生成有洞察力的、 简洁的、易于理解的SEO报告&#xff0c;帮助你的网页排名和表现更好 网站源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/

苹果CMS:如何去掉首页帮助提示信息

首先我们安装好苹果CMS&#xff0c;未安装的可以参考苹果cms&#xff1a;介绍及安装 安装好之后我们需要进入模版设置&#xff0c;可能对于刚刚接触CMS框架的朋友是不清楚地址的&#xff1a; https://www.yourweb.com/admin_login.php/admin/mxpro/mxproset 其中【yourweb】…

探索移动云:我的ES与Kibana之旅

目录 引言&#xff1a; 如何免费体验移动云产品 登录并完成实名认证 选择试用ECS云主机 安全组配置 安装Elasticsearch和Kibana 安装Elasticsearch ​编辑安装kibana 测试结果 使用感觉 引言&#xff1a; 移动云技术产品的发展已经取得了巨大的进步。云数融合、A1、大…

宝塔面包安装搭建Flarum开源论坛程序 文档教程

一、服务器环境说明 宝塔 7.0.3 或更新版本 Linux Server&#xff08;本文用的是 CentOs 7.4.6 64位&#xff09; Apache 或者 Nginx&#xff08;本文用的是 Nginx 1.16.0&#xff09; MySQL 5.6&#xff08;本文使用 MySQL 5.7&#xff0c;原因请看下方引用&#xff09; PHP 7…

weblogic ssrf漏洞(CVE-2014-4210)

漏洞复现环境搭建请参考 Vulhub漏洞复现环境搭建流程_vulhub一键搭建漏洞测试靶场,来进行漏洞复现-CSDN博客 docker未能成功启动redis请参考 http://t.csdnimg.cn/5osP3 漏洞版本 weblogic 10.0.2 -- 10.3.6.0 漏洞验证 &#xff08;1&#xff09;访问7001端口&#xff0c;…

基于MetaGPT构建单智能体

前言 在之前的文章中&#xff0c;我们详细地描述了Agent的概念和组成&#xff0c;在代码案例中体验了Agent的记忆、工具、规划决策模块&#xff0c;并通过几个Agent框架来加强读者对Agent开发设计与应用的理解&#xff0c;接下来我们就要进入智能体Agent的实际开发中&#xff0…

Linux系统Redhat7.4版本安装mysql-5.7.17详细步骤

1.1、在根目录创建一个data目录 mkdir /data 1.2、将MySQL安装包上传到/data目录下 1.3、解压MySQL安装包到当前目录 tar -zxvf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz 1.4、因为解压后MySQL目录名称太长&#xff0c;修改成简短的mysql mv mysql-5.7.17-linux-glibc2.…

AI智能体|扣子Coze“图像流”功能速览

大家好&#xff0c;我是无界生长。 AI智能体&#xff5c;扣子Coze“图像流”功能速览Coze提供易上手的图像处理工作流&#xff0c;包含智能生成、智能编辑和基础编辑三类节点&#xff0c;旨在通过AI技术简化图像处理过程。本文对扣子Coze“图像流”功能做了简单介绍&#xff0…

爬虫学习--11.MySQL数据库的基本操作(上)

MySQL数据库的基本操作 创建数据库 我们可以在登陆 MySQL 服务后&#xff0c;使用命令创建数据库&#xff0c;语法如下: CREATE DATABASE 数据库名; 显示所有的数据库 show databases; 删除数据库 使用普通用户登陆 MySQL 服务器&#xff0c;你可能需要特定的权限来创建或者删…