defer 执行 时间
defer 一般 定义在 函数 开头, 但是 他会 最后 被执行
A defer statement defers the execution of a function until the surrounding function returns.
如果说 为什么 不在 末尾 定义 defer 呢, 因为 当 错误 发生时, 程序 执行 不到 末尾 就会 崩溃.
defer 的 参数 定义 会 立刻 被执行, 最后 被执行 的 只有 最外层 函数的 定义.
The deferred call’s arguments are evaluated immediately, but the function call is not executed until the surrounding function returns.
下边 的 例子 需要好好 理解,
会最后 被执行的 , 只有 最外层的 函数调用
第二层的 函数 作为 参数 传入 时, 也会被 立即 执行.
defer 中的 变量, 会立即 保存 当前 状态,
比如 x:=1 ; defer print(x); x=2 , 只会 输出 1
defer 是 stack 类型的 顺序, 先入后出
先定义 的 defer 会 最后被执行
理解 defer 执行 时机
defer 执行 还是 比较有特色的, 需要 特殊记忆
package mainimport "fmt"func main() {defer fmt.Println("world1")defer fmt.Println(fmt.Println("world2"))fmt.Println("hello")return fmt.Println("finally")
}
# output:
world2
hello
7 <nil>
world1
defer 用与 关闭文件
func CopyFile(dstName, srcName string) (written int64, err error) {src, err := os.Open(srcName)if err != nil {return}defer src.Close()dst, err := os.Create(dstName)if err != nil {return}defer dst.Close()return io.Copy(dst, src)
}