go语言defer深入理解【golang笔记】原创
原创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 }
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除