Go 语言函数式编程系列教程(十九) —— 函数篇:函数的传参和返回值

栏目: Go · 发布时间: 5年前

内容简介:上篇教程我们介绍了 Go 语言中函数的基本定义和调用,其中也涉及到了函数的传参和返回值,只不过那里演示的是最简单的场景,今天我们就更复杂的传参和返回值进行介绍。Go 语言默认使用按值传参来传递参数,也就是传递参数的一个副本,函数接收该参数后,可能在处理过程中对参数值做调整,但这不会影响原来的变量值,我们还是以上篇教程的当我们把

上篇教程我们介绍了 Go 语言中函数的基本定义和调用,其中也涉及到了函数的传参和返回值,只不过那里演示的是最简单的场景,今天我们就更复杂的传参和返回值进行介绍。

按值传参和引用传参

Go 语言默认使用按值传参来传递参数,也就是传递参数的一个副本,函数接收该参数后,可能在处理过程中对参数值做调整,但这不会影响原来的变量值,我们还是以上篇教程的 add 函数为基础作为示例:

func add(a, b int) int  {
    a *= 2
    b *= 3
    return a + b
}

func main()  {
    x, y := 1, 2
    z := add(x, y)
    fmt.Printf("add(%d, %d) = %d\n", x, y, z)  
}

当我们把 xy 变量作为参数传递到 add 函数时,这两个变量会拷贝出一个副本赋值给 ab 变量作为参数,因此,在 add 函数中调整 ab 变量的值并不会影响原变量 xy 的值,所以上述代码的输出是:

add(1, 2) = 8

如果你想要实现在函数中修改参数值可以同时修改原变量,需要通过引用传参来完成,此时传递给函数的参数是一个指针,而指针代表的是原变量的地址,修改指针指向的值即修改变量地址中存储的值,所以原变量的值也会被修改(这种情况下,传递的是变量地址值的拷贝,所以从本质上来说还是按值传参):

func add(a, b *int) int {
    *a *= 2
    *b *= 3
    return *a + *b
}

func main()  {
    x, y := 1, 2
    z := add(&x, &y)
    fmt.Printf("add(%d, %d) = %d\n", x, y, z)
}

此时,上述代码的打印结果如下:

add(2, 6) = 8

在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型 默认使用引用传参(即使没有显示的指出指针,类似 PHP 中把对象实例作为函数参数)。

多返回值及返回值命名

Go 语言函数与其他编程语言一大不同之处在于支持多返回值,这在处理程序出错的时候非常有用,比如,如果上述 add 函数只支持非负整数相加,传入负数则会报错,换做是在其他语言如 PHP 中,我们需要对返回结果做各种判断,才能实现预期的效果,在 Go 语言中,只需要通过在返回值中多返回一个错误信息即可:

func add(a, b *int) (int, error) {
    if (*a < 0 || *b < 0) {
        err := errors.New("只支持非负整数相加")
        return 0, err
    }
    *a *= 2
    *b *= 3
    return *a + *b, nil
}

func main()  {
    x, y := -1, 2
    z, err := add(&x, &y)
    if (err != nil) {
        fmt.Println(err.Error())
        return
    }
    fmt.Printf("add(%d, %d) = %d\n", x, y, z)
}

如上所示,我们通过 error 指定多返回一个表示错误信息的、类型为 error 的返回值,函数的多个返回值之间可以通过逗号分隔,并且在最外面通过圆括号包起来。由于 add 函数不支持传入负数,所以上述代码打印信息如下:

只支持非负整数相加

此外,在设置多返回值时,还可以对返回值进行变量命名,这样,我们就可以在函数中直接对返回值变量进行赋值,而不必每次都按照指定的返回值格式返回多个变量了:

func add(a, b *int) (c int, err error) {
    if (*a < 0 || *b < 0) {
        err = errors.New("只支持非负整数相加")
        return
    }
    *a *= 2
    *b *= 3
    c = *a + *b
    return
}

这种机制避免了每次进行 return 操作时都要关注函数需要返回哪些返回值,为开发者节省了精力,尤其是在复杂的函数中。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

小白学运营

小白学运营

刘异、伍斌、赵强 / 电子工业出版社 / 2015-9-1 / 49.00元

《小白学运营》是针对网络游戏行业,产品运营及数据分析工作的入门读物,主要为了帮助刚入行或有意从事游戏产品运营和数据分析的朋友。 《小白学运营》没有烦琐的理论阐述,更接地气。基础运营部分可以理解为入门新人的to do list;用户营销部分则是对用户管理的概述,从用户需求及体验出发,说明产品运营与用户管理的依附关系;数据分析实战中,侧重业务分析,着重阐述的是分析框架,以虚拟案例的方式进行陈述,......一起来看看 《小白学运营》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具