美文网首页
1.2.3函数多返回值

1.2.3函数多返回值

作者: rosekissyou | 来源:发表于2020-06-23 17:46 被阅读0次

    目前的主流语言中除Python外基本都不支持函数的多返回值功能,不是没有这类需求,可能

    是语言设计者没有想好该如何提供这个功能,或者认为这个功能会影响语言的美感。

    比如我们如果要定义一个函数用于返回个人名字信息,而名字信息因为包含多个部分——姓

    氏、名字、中间名和别名,在不支持多返回值的语言中我们有以下两种做法:要么专门定义一个

    结构体用于返回,比如:

    struct 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语言革命性地在静态开发语言阵营中率先提供了多返回值功能。这个特性让开发者可以

    从原来用各种比较别扭的方式返回多个值的痛苦中解脱出来,既不用再区分参数列表中哪几个用

    于输入,哪几个用于输出,也不用再只为了返回多个值而专门定义一个数据结构。

    在Go语言中,上述的例子可以修改为以下的样子:

    func getName()(firstName, middleName, lastName, nickName string){

    return "May", "M", "Chen", "Babe"

    }

    因为返回值都已经有名字,因此各个返回值也可以用如下方式来在不同的位置进行赋值,从

    而提供了极大的灵活性:

    func getName()(firstName, middleName, lastName, nickName string){

    firstName = "May"

    middleName = "M"

    lastName = "Chen"

    nickName = "Babe"

    return

    }

    并不是每一个返回值都必须赋值,没有被明确赋值的返回值将保持默认的空值。而函数的调

    用相比C/C++语言要简化很多:

    fn, mn, ln, nn := getName()

    如果开发者只对该函数其中的某几个返回值感兴趣的话,也可以直接用下划线作为占位符来

    忽略其他不关心的返回值。下面的调用表示调用者只希望接收lastName的值,这样可以避免声

    明完全没用的变量:

    _, _, lastName, _ := getName()

    我们会在第2章中详细讲解多重返回值的用法。

    相关文章

      网友评论

          本文标题:1.2.3函数多返回值

          本文链接:https://www.haomeiwen.com/subject/jcghfktx.html