return 做了什么?

  1. 返回值 赋值
  2. return 返回值

defer 什么时候执行?

  1. 返回值 赋值
  2. defer func
  3. return 返回值

返回值 看作一个中间商,比如一个tmp变量。先回忆一下函数如何定义返回值。

  • func 使用 有名返回值

    func f() x int {
      ...
      return
    }
  • func 使用 匿名返回值

    func f() int {
      ...
      return x
    }

我豁然开朗的关键点

返回值 看作和x、y不一样的另一个变量即可,咱们只关注它的值的指向。


栗子1

func f1() int {
    x := 5
    defer func() {
        x++
    }()
    return x
}
  1. 返回值 = x = 5,返回值指向5
  2. 不管defer如何操作
  3. return 返回值,即 return 5

栗子2

func f2() (x int) {
    defer func() {
        x++
    }()
    return 5
}
  1. 返回值x,x指向5
  2. 闭包defer修改x的指向为6
  3. return 返回值,即 return x,return 6

栗子3

func f3() (y int) {
    x := 5
    defer func() {
        x++
    }()
    return x
}
  1. 返回值y,y=x=5,y指向5
  2. 闭包defer修改x的指向为6
  3. return 返回值,即 return y,return 5

栗子4

func f4() (x int) {
    defer func(x int) {
        x++
    }(x)
    return 5
}
  1. 返回值x,x=5,x指向5
  2. defer值拷贝,内部操作与外部无关
  3. return 返回值,即 return x,return 5

标签: none

添加新评论