乐趣区

关于go:Defer

defer 简介

defer 艰深来讲就是提早调用。defer 会在以后函数返回之前执行 defer 注册的函数。
例如:defer func_x() 这样语句会让你注册一个函数变量到 defer 的全局链表中,在 defer 语句所在的函数退出之前调用。

次要应用场景

panic 场景 :这个是重要的一个个性,通常能简化咱们的代码,确保无论任何场景,defer 的函数肯定调用,通常用在锁或者资源的开释场景较多;
配套的两个行为代码能够放在最近的地位:创立 & 开释、加锁 & 放锁、前置 & 后置,使得代码更易读,编程体验优良。最近的中央是哪里?下一行

提早调用

package main

func main() {defer println("--- defer ---")
    println("--- end ---")
}

defer 会在 main 函数之前调用。
外围要点:

提早调用:defer 语句自身尽管是 main 的第一行,然而 fmt.Println 是先打印的;
defer 关键字肯定是处于函数上下文:defer 必须放在函数外部

LIFO

一个函数内有多个 defer 时,压栈式执行,后入先出。

package main

import "fmt"

func main() {defer func() {fmt.Println("1")
    }()

    defer func() {fmt.Println("2")
    }()}

异样场景

留神:肯定要先注册 defer,放在函数第一行,放到如下代码 return 之前,是无奈捕捉异样的;

package main

import "fmt"

func main() {defer func() {if err := recover(); err != nil {fmt.Println("捕捉 panic", err)
        }
    }()

    var sliceOne []int
    sliceOne[0] = 1

    return
}
退出移动版