10.defer

1.defer

1.1.示例说明

defer1.go

package chapter07

import "fmt"

// main
func Run() {
    // defer 相当于 压栈,先进后出 原则
    defer fmt.Println("main.end1") 
    defer fmt.Println("main.end2")

    fmt.Println("main::hello go 1")
    fmt.Println("main::hello go 2")
}

defer1_test.go

package chapter07

import "testing"

func TestRun(t *testing.T) {
    Run()
}

执行结果

=== RUN   TestRun
main::hello go 1
main::hello go 2
main.end2
main.end1
--- PASS: TestRun (0.00s)
PASS
ok      

2.defer知识点

2.1.defer 的调用顺序

示例代码

defer2.go

/*
 知识点一:defer的执行顺序
*/
package chapter07

import "fmt"

func func1() {
    fmt.Println("A")
}
func func2() {
    fmt.Println("B")
}
func func3() {
    fmt.Println("C")
}

// main
func Run2() {
    defer func1()
    defer func2()
    defer func3()
}

defer2_test.go

package chapter07

import "testing"

func TestRun2(t *testing.T) {
    Run2()
}

执行结果

=== RUN   TestRun2
C
B
A
--- PASS: TestRun2 (0.00s)
PASS
ok  

图示说明

defer函数压栈

调用func3()


调用func2()

调用func1()

2.2.知识点二--defer和return谁先谁后

示例代码

defer3.go

/*
 知识点二:defer和return谁先谁后
*/
package chapter07

import "fmt"

func deferFunc() int {
    fmt.Println("defer func called ...")
    return 0
}

func returnFunc() int {
    fmt.Println("return func called ...")
    return 1
}

// returnAndDefer 函数
func returnAndDefer() int {
    defer deferFunc()
    return returnFunc()
}

// main
func Run3() {
    returnAndDefer()
}

defer3_test.go

package chapter07

import "testing"

func TestRun3(t *testing.T) {

    Run3()
}

执行结果

=== RUN   TestRun3
return func called ...
defer func called ...
--- PASS: TestRun3 (0.00s)
PASS
ok      

说明

  • return 函数 优先于 defer 函数
  • defer 函数是在函数运行结束后,才进行出栈调用

3.总结

posted @ 2021-10-08 12:03  可可逗豆  阅读(111)  评论(0)    收藏  举报