函数的多返回值
目前的主流语言中,除了python外,基本都不支持函数的多返回值功能,不是没有这类需求,可能是语言开发者没有想好该如何提供这个功能,或者认为这个功能会影响语言的美感。
比如我们如果要定义一个函数用于返回个人名字信息,而名字信息因为包含多个部分---姓氏,名字,中间名和别名,在不支持多返回值的语言中我们有以下2种做法:要么专门定义一个结构(面向对象思维)用于返回,比如
struc name
{
char first_name[20];
char middle_name[20];
char last_name[20];
char nick_name[48];
};
//函数原型
extern name get_name();
//函数调用
name n = get_name();
//或者以传出参数的方式返回多个结果:
//函数原型
extern void get_name(
/*out*/ char* first_name,
/*out*/ char* middle_name,
/*out*/ char* last_name,
/*out*/ char* nick_name
);
//先内存分配
char first_name[20];
char middle_name[20];
char last_name[20];
char nick_name[48];
//函数调用
get_name(first_name,middle_name,last_name,nick_name);
go语言革命性的在静态语言阵营中率先提出了多返回值功能。这个特性让开发者可以从原来用各种比较别扭的方式返回多个值的痛苦中解脱出来,既不用再区分参数列表哪几个用于输入,哪几个用于输出,也不用再只为了返回多个值而专门定义一个数据结构:
func getName() (first_name,middle_name,last_name,nick_name string){
return "May","M","Chen","Babe"
}
因为返回值都已经又了名字,因此各个返回值也可以用下面的方式来在不同的位置进行赋值,从而提供极大的灵活性
func getName() (first_name,middle_name,last_name,nick_name string){
first_name="May"
middle_name="M"
last_name="Chen"
nick_name="Babe"
return
}
并不是每个返回值都需要赋值,没有被明确赋值的返回值将保持默认的空值,而函数的调用相比C/C++ 语言要简化很多:
fn,mn,ln,nn :=getName()
//当你对某个返回值不感兴趣或者用不上的时候 可以用 _ 占位符
_,_,last_name,_ :=getName()