您的位置:首页 > 财经 > 产业 > Go 和 Delphi 定义可变参数函数的对比

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

2024/11/15 16:24:39 来源:https://blog.csdn.net/longchanghua_enshi/article/details/139099089  浏览:    关键词: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;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com