理解return
return 做了什么?
- 返回值 赋值
- return 返回值
defer 什么时候执行?
- 返回值 赋值
- defer func
- 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
}
- 返回值 = x = 5,返回值指向5
- 不管defer如何操作
- return 返回值,即 return 5
栗子2
func f2() (x int) {
defer func() {
x++
}()
return 5
}
- 返回值x,x指向5
- 闭包defer修改x的指向为6
- return 返回值,即 return x,return 6
栗子3
func f3() (y int) {
x := 5
defer func() {
x++
}()
return x
}
- 返回值y,y=x=5,y指向5
- 闭包defer修改x的指向为6
- return 返回值,即 return y,return 5
栗子4
func f4() (x int) {
defer func(x int) {
x++
}(x)
return 5
}
- 返回值x,x=5,x指向5
- defer值拷贝,内部操作与外部无关
- return 返回值,即 return x,return 5