golang学习笔记五:defer简介

也是不知道应该写在哪儿不如新开一个文件系列。

简介

1
2
3
4
5
6
7
8
func Contents(filename string) (string, error) {
f, err := os.Open(filename)
if err != nil {
return "", err
}
defer f.Close() // f.Close will run when we're finished.
return nil
}

也就是在函数执行结束之后会执行defer调用的函数内容,就像析构函数一样做一些清理之类的操作。

使用

defer后面只能跟一个函数调用!

好处

  • defer可以保证即使函数因为panic等意外退出的时候也可以将一些必要的东西执行
  • 书写好看,比如上面的打开一个文件,defer可以让关闭的操作挨着打开。

调用

defer是什么时候被调用呢,抄的博客:https://www.jianshu.com/p/5b0b36f398a2

里面研究了return的汇编:

return指令的执行分三步,第一步拷贝return值到返回值内存地址,第二步会调用runtime.deferreturn去执行前面注册的defer函数,第三部再执行ret汇编指令。

执行顺序

defer的执行默认是先进后出(LIFO),所以如果一个函数里出现以下代码:

1
2
3
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}

最后输出的顺序会变成 4,3,2,1,0