defer

  Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句。当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回。

defer的用法类似Java中的

  1. try {
  2. }finally {
  3. }

  我们先看这个例子pro04_4_1.go

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main() {
  6. for i := 0; i < 5; i++ {
  7. defer fmt.Printf("%d ", i)
  8. }
  9. }

defer执行的方式是后进先出(LIFO),所以执行的结果是4 3 2 1 0。如果不加defer,输出的结果就是0 1 2 3 4

defer的典型用用场景

  Go中的defer绝对是一个对程序狗非常贴心的设计,很多时候,我们写程序打开文件、数据库的时候都有可能会忘记写关闭,主要是由于逻辑判断的过多,导致我们可能在某个分支里面忘记了关闭,有了defer就会很大程度的避免这个逻辑错误。

  defer的意思是”在函数退出时调用”,特别用于对文件进行读写操作的时候,需要在open之后要调用close操作,将close操作使用defer。

  1. //写文件
  2. func writeFile(channels []models.Channel,filename string){
  3. fout,err := os.Create(filename) //打开文件
  4. defer fout.Close()//紧接着打开写一句当函数结束的时候关闭文件。
  5. ……//此处去写对文件的各种操作
  6. }

链接