golang的defer执行时机案例分析

package main
import "fmt"

func calcFunc(x int, y int) int {
	return x + y
}

func main() {
	// defer语句的执行顺序是,从右到左,逆序执行
	deferDemo()

	// deferDemo1函数
	demo1 := deferDemo1()
	fmt.Println(demo1) // 0

	// deferDemo2函数
	demo2 := deferDemo2()
	fmt.Println(demo2) // 1

	// deferDemo4
	demo4 := deferDemo4()
	fmt.Println(demo4) // 1

	// deferDemo5
	demo5 := deferDemo5()
	fmt.Println(demo5) // 1

	// deferDemo6
	demo6 := deferDemo6()
	fmt.Println(demo6) // 2

	// 难点解析
	/*
		   分析:
			defer注册顺序:
			1.defer fmt.Println("AA", calcFunc(x, calcFunc(x, y)))
			2.defer fmt.Println("BB", calcFunc(x, calcFunc(x, y)))
			defer执行顺序:
			1. fmt.Println("BB", calcFunc(x, calcFunc(x, y)))
			2. fmt.Println("AA", calcFunc(x, calcFunc(x, y)))

	*/
	x := 1
	y := 2
	// 注册的时候 x = 1, y = 2 所以执行的时候x = 1, y = 2
	defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2)  // 结果是:4
	x = 10
	// 注册的时候x = 10, y = 2 所以执行的时候x = 10, y = 2
	defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 结果是:22
	y = 20

}

分析:

defer语句的执行顺序是,从右到左,逆序执行

执行deferDemo()函数时,会先执行defer语句,再执行函数体,函数体执行完后,再执行defer语句

执行结果:

开启defer

结束defer

defer语句6

defer语句5

defer语句4

defer语句3

defer语句2

defer语句1

func deferDemo() {
	fmt.Println("开启defer")
	defer func() {
		fmt.Println("defer语句1")
	}()
	defer func() {
		fmt.Println("defer语句2")
	}()
	defer func() {
		fmt.Println("defer语句3")
	}()

	defer fmt.Println("defer语句4")
	defer fmt.Println("defer语句5")
	defer fmt.Println("defer语句6")

	fmt.Println("结束defer")
}

deferDemo1执行结果是 0,延迟执行

func deferDemo1() int {
	var a int

	defer func() {
		a++
	}()

	return a
}

deferDemo1执行结果是1:原因返回匿名返回值a等待函数体内操作完成才会执行return

func deferDemo2() (a int) {
	// 步骤一先赋值
	//a = 0

	// 步骤二再执行defer语句
	defer func() {
		a++
	}()

	// 步骤三再执行函数体
	// 返回值a等待函数体内操作完成才会执行return
	return a
}

deferDemo3执行结果是1: 原因返回匿名返回值a等待函数体内操作完成才会执行return

func deferDemo3() (a int) {
	defer func() {
		a++
	}()

	return a
}

deferDemo4

func deferDemo4() int {
	x := 1

	defer func(x int) {
		x++ // 内部x和外面x不是同一个变量
	}(x)

	return x // 1
}

deferDemo5

func deferDemo5() (x int) {
	x = 1

	defer func(x int) {
		x++ // 内部x和外面x不是同一个变量
	}(x)

	return x // 1
}

deferDemo6

func deferDemo6() (x int) {
	x = 1

	defer func() {
		x++
	}()

	return x // 2
}
相关推荐
007php0073 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
MClink10 小时前
Go怎么做性能优化工具篇之pprof
开发语言·性能优化·golang
m0_7482546612 小时前
go官方日志库带色彩格式化
android·开发语言·golang
Algorithm157616 小时前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
Narutolxy17 小时前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader17 小时前
全面解析 Golang Gin 框架
开发语言·golang·gin
hkNaruto2 天前
【P2P】【Go】采用go语言实现udp hole punching 打洞 传输速度测试 ping测试
golang·udp·p2p
入 梦皆星河2 天前
go中常用的处理json的库
golang
海绵波波1072 天前
Gin-vue-admin(2):项目初始化
vue.js·golang·gin
每天写点bug2 天前
【go每日一题】:并发任务调度器
开发语言·后端·golang