1. 返回值

1.1.1. 函数返回值

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

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

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

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

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

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func add(a, b int) (c int) {
  6. c = a + b
  7. return
  8. }
  9. func calc(a, b int) (sum int, avg int) {
  10. sum = a + b
  11. avg = (a + b) / 2
  12. return
  13. }
  14. func main() {
  15. var a, b int = 1, 2
  16. c := add(a, b)
  17. sum, avg := calc(a, b)
  18. fmt.Println(a, b, c, sum, avg)
  19. }

输出结果:

  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. package main
  2. func test() (int, int) {
  3. return 1, 2
  4. }
  5. func add(x, y int) int {
  6. return x + y
  7. }
  8. func sum(n ...int) int {
  9. var x int
  10. for _, i := range n {
  11. x += i
  12. }
  13. return x
  14. }
  15. func main() {
  16. println(add(test()))
  17. println(sum(test()))
  18. }

输出结果:

  1. 3
  2. 3

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

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

输出结果:

  1. 3

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

  1. func add(x, y int) (z int) {
  2. { // 不能在一个级别,引发 "z redeclared in this block" 错误。
  3. var z = x + y
  4. // return // Error: z is shadowed during return
  5. return z // 必须显式返回。
  6. }
  7. }

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

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

输出结果:

  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. println(add(1, 2)) // 输出: 203
  11. }

输出结果:

  1. 203
  2. 203