乐趣区

关于golang:聊聊golang的defer

本文次要钻研一下 golang 的 defer

defer

  • return 先赋值 ( 对于命名返回值),而后执行 defer,最初函数返回
  • defer 函数调用的执行程序与它们别离所属的 defer 语句的执行程序相同
  • defer 前面的表达式能够是 func 或者是 method 的调用,如果 defer 的函数为 nil,则会 panic

实例

实例 1

// f returns 42
func f() (result int) {defer func() {
        // result is accessed after it was set to 6 by the return statement
        result *= 7
    }()
    return 6
}

这里 return 先给 result 赋值为 6,之后执行 defer,result 变为 42,最初返回 42

实例 2

func f() int {
    result := 6
    defer func() {
        // result is accessed after it was set to 6 by the return statement
        result *= 7
    }()
    return result
}

这里 return 确定返回值 6,之后 defer 批改 result,最初函数返回 return 确定的返回值

实例 3

func multiDefer() {
    for i := 3; i > 0; i-- {defer func(n int) {fmt.Print(n, " ")
        }(i)
    }

    for i := 3; i > 0; i-- {defer fmt.Print(i, " ")
    }
}

多个 defer 函数,按程序逆序执行,这里输入 1 2 3

实例 4

var fc func() string

func main() {fmt.Println("hello")
    defer fc()}

因为 defer 指定的 func 为 nil,这里 panic

实例 5

func main() {
    for i := 3; i > 0; i-- {defer func() {fmt.Print(i, " ")
        }()}
}

因为 defer 这里调用的 func 没有参数,等执行的时候,i 曾经为 0,因此这里输入 3 个 0

小结

defer 能够拆解为 return 赋值,defer 执行,最初代码返回三步;defer 的程序按逆序执行。

doc

  • Defer_statements
  • Golang 之 Defer
  • golang 中 defer 执行机会与常见问题
退出移动版