也是不知道应该写在哪儿不如新开一个文件系列。
简介
1 | func Contents(filename string) (string, error) { |
也就是在函数执行结束之后会执行defer调用的函数内容,就像析构函数一样做一些清理之类的操作。
使用
defer后面只能跟一个函数调用!
好处
- defer可以保证即使函数因为panic等意外退出的时候也可以将一些必要的东西执行
- 书写好看,比如上面的打开一个文件,defer可以让关闭的操作挨着打开。
调用
defer是什么时候被调用呢,抄的博客:https://www.jianshu.com/p/5b0b36f398a2
里面研究了return的汇编:
return指令的执行分三步,第一步拷贝return值到返回值内存地址,第二步会调用runtime.deferreturn去执行前面注册的defer函数,第三部再执行ret汇编指令。
执行顺序
defer的执行默认是先进后出(LIFO),所以如果一个函数里出现以下代码:
1 | for i := 0; i < 5; i++ { |
最后输出的顺序会变成 4,3,2,1,0