关于defer的三条重要原则:
1、一个deferred 函数的参数会先被计算好。
2、一个函数里的所有deferred函数会按照LIFO顺序执行。
3、deferred函数可能会读取命名返回值并赋值。(当函数有命名返回值的时候)
当有命名返回值,并有defer的时候,要特别小心。
当panic(恐慌)遇到recover时,会恢复当前goroutine的正常执行,否则向上一层层引发panic,直到
当前goroutine的函数栈的所有函数都返回,最终导致当前goroutine停止运行。
defer后面只能跟函数调用。(执行单条语言无太大意义)
recover只能在defer的函数里使用。(发生panic后,只有defer后面的函数会执行)