go语言defer深入理解【golang笔记】原创

原创
小哥 3年前 (2022-10-22) 阅读数 47 #大杂烩

Go语言中的defer该语句会延迟其后面的语句。在……里面defer当属性函数即将返回时,按下延迟的语句。defer执行与定义相反的顺序,即首先执行。defer最终执行该语句,并最终defer语句,该语句首先执行。defer 语句可以轻松处理资源释放问题。

1、example01

defer执行顺序是超前并遵循的,在定义中,符合堆栈的结构可以理解为。defer之后,将对应的函数依次压入堆栈,在函数结束之前,依次将对应的函数执行出堆栈。

package main

import (
    "fmt"
)
func f1() {
    fmt.Println("我是f1")
}
func f2() {
    fmt.Println("我是f2")
}
func f3() {
    fmt.Println("我是f3")
}
func main() {
    x := 10
    fmt.Println("我才是开始!")
    defer f1()
    defer f2()
    defer f3()  
    x = 20
    fmt.Println("x的值是:", x)
    fmt.Println("我是结束")
}
//执行结果为:
/*
我才是开始!
x的值是: 20
我是结束
我是f3
我是f2
我是f1
*/

2、example02

当defer声明时,它的参数是明确的。

package main

import (
    "fmt"
)

func f1(x int) int {
    fmt.Println("我是f1函数")
    return x + 1
}
func f2(x int) int {
    fmt.Println("我是f2函数")
    return x + 2
}
func f3(x int) int {
    fmt.Println("我是f3函数")
    return x + 3
}
func f4(x int) int {
    fmt.Println("我是f4函数")
    return x + 4
}

func f5(x int) int {
    fmt.Println("我是f5函数")
    return x + 5
}

func main() {
    x := 10
    fmt.Println("我才是开始!")
    defer f1(x)
    defer f2(x)
    defer f3(x)
    defer fmt.Println(f4(x))
    x = 20
    defer fmt.Println(f5(x))
    fmt.Println("x的值是:", x)
    fmt.Println("我是结束")
}
//输出结果
/**
我才是开始!
我是f4函数
我是f5函数
x的值是: 20
我是结束
25
14
我是f3函数
我是f2函数
我是f1函数
**/

3、example03

defer 您可以读取名称返回值。
在Go在语言的功能上return语句在底部不是原子操作,它们分为赋值以返回值和RET命令两个步骤。和defer语句执行的时间正好在返回值赋值操作之后,RET在指令执行之前。具体如下图所示:

package main

import (
    "fmt"
)

func fn() (x int) {
    defer func() {
        x++
    }()
    return 5
}
func main() {
    fmt.Println(fn())
}
//运行结果
/**
6
**/

4、defer深入理解练习(手)

以下示例摘自 [[李温州博客]]](https://www.liwenzhou.com/posts/Go/09_function/)

  • 例题1

    package main

    import "fmt"

    func f1() int { x := 5 defer func() { x++ }() return x }

    func f2() (x int) { defer func() { x++ }() return 5 }

    func f3() (y int) { x := 5 defer func() { x++ }() return x } func f4() (x int) { defer func(x int) { x++ }(x) return 5 } func main() { fmt.Println(f1()) fmt.Println(f2()) fmt.Println(f3()) fmt.Println(f4()) }

  • 例题2

    package main

    import "fmt"

    func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret }

    func main() { x := 1 y := 2 defer calc("AA", x, calc("A", x, y)) x = 10 defer calc("BB", x, calc("B", x, y)) y = 20 }

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门