Go return,defer,panic执行分析
基本原则
- defer表示在函数结束前执行,并且多个defer是FILO的执行顺序
- panic只会执行一个,recover的不算,后续的不会执行
- return 返回与函数定义的是否带有返回参数是不一样的
return 和 defer
一个有返回值的函数,可以有以下2种定义:
1 |
// 不带有返回值参数 |
这sum1和sum2结果是一样的,但是组合上defer,会有不一样结果:
1 |
func sum3(x,y int)int{ |
s3=3,s4=5,简单理解:
- 函数在开始执行的时候,先初始化了它的返回值,如果未声明,随机一个tempS,如果声明了,即s
- 在执行到return(返回标志)的时候赋值。
- sum3函数先在执行到return时候,将tempS赋值为s,即3。由于s和tempS3是不同的变量,defer中的s+2就与tempS3无关。
- sum4函数由于声明了返回变量s,return时候,如果是
return x+y,其实将x+y复制给s,如果直接return,可以理解为跳过了复制操作。
在return之后的defer,s与sum3所谓的tempS3其实是一个,所以defer的操作是有效的。
- 补充,go多值返回:https://www.cntofu.com/book/3/zh/03.2.md
defer 和 panic
1 |
func main() { |
没什么好说的…