1. 返回值

    标识符,用来忽略函数的某个返回值

    Go 的返回值可以被命名,并且就像在函数体开头声明的变量那样使用。

    返回值的名称应当具有一定的意义,可以作为文档使用。

    没有参数的 return 语句返回各个返回变量的当前值。这种用法被称作“裸”返回。

    直接返回语句仅应当用在像下面这样的短函数中。在长的函数中它们会影响代码的可读性。

    1. 1 2 3 3 1

    Golang返回值不能用容器对象接收多返回值。只能用多个变量,或 "_" 忽略。

    1. package main
    2. func test() (int, int) {
    3. return 1, 2
    4. }
    5. func main() {
    6. // s := make([]int, 2)
    7. // s = test() // Error: multiple-value test() in single-value context
    8. x, _ := test()
    9. println(x)
    10. }

    输出结果:

    1. 1

    多返回值可直接作为其他函数调用实参。

    输出结果:

    1. 3
    2. 3

    命名返回参数可看做与形参类似的局部变量,最后由 return 隐式返回。

    1. func add(x, y int) (z int) {
    2. z = x + y
    3. return
    4. }
    5. func main() {
    6. println(add(1, 2))
    7. }
    1. 3

    命名返回参数可被同名局部变量遮蔽,此时需要显式返回。

    命名返回参数允许 defer 延迟调用通过闭包读取和修改。

    1. package main
    2. func add(x, y int) (z int) {
    3. defer func() {
    4. z += 100
    5. }()
    6. z = x + y
    7. }
    8. func main() {
    9. println(add(1, 2))
    10. }

    输出结果:

    1. 103

    显式 return 返回前,会先修改命名返回参数。

    1. package main
    2. func add(x, y int) (z int) {
    3. defer func() {
    4. println(z) // 输出: 203
    5. }()
    6. z = x + y
    7. return z + 200 // 执行顺序: (z = z + 200) -> (call defer) -> (return)
    8. }
    9. func main() {
    10. }

    输出结果: