go defer延时机制

在函数中,程序员经常需要创建资源(比如:数据库连接,文件句柄,锁等),为了在函数执行完结后,及时的释放资源,Go提供了defer(延时机制)

//当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈)
//当函数执行完结后,再从defer栈,按照先入后出的方式出栈,执行
func sum(n1 int, n2 int) int {
    defer fmt.Println("ok1 n1=", n1) //3.ok1 n1=10
    defer fmt.Println("ok2 n2=", n2) //2.ok2 n2=20
    res := n1 + n2
    fmt.Println("ok3 res=", res) // 1.ok3 res =30
    return res
}

func main() {
    res := sum(10, 30)
    fmt.Println("ok4 res=", res) //4.ok4 res=30
}
go defer延时机制_第1张图片

细节说明

1、当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈)
2、当函数执行完结后,再从defer栈,按照先入后出的方式出栈,执行
3、在defer语句压入栈时,也会有相关的值拷贝到栈

package main
import (
    "fmt"
)
//当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈)
//当函数执行完结后,再从defer栈,按照先入后出的方式出栈,执行
func sum(n1 int, n2 int) int {
    defer fmt.Println("ok1 n1=", n1) //3.ok1 n1=10
    defer fmt.Println("ok2 n2=", n2) //2.ok2 n2=20
    n1++                             //n1=11
    n2++                             //n2=21
    res := n1 + n2
    fmt.Println("ok3 res=", res) // 1.ok3 res =32
    return res
}
func main() {
    res := sum(10, 30)

    fmt.Println("ok4 res=", res) //4.ok4 res=32
}
go defer延时机制_第2张图片
  • defer最主要的价值是:在函数执行完之后释放函数创建的资源

你可能感兴趣的:(go defer延时机制)