关于 Golang defer 的使用规则和案例
发布时间:2023-01-07 编辑:jiaochengji.com
教程集为您提供关于 Golang defer 的使用规则和案例等资源,欢迎您收藏本站,我们将为您提供最新的关于 Golang defer 的使用规则和案例资源
golang
defer
这个使用的执行流程一直很绕,所以决定写一篇文记录一下。
规则一:当defer被声明时,其参数就会被实时解析
案例一
package main
import (
"fmt"
)
func main() {
test()
}
func test() {
defer f1(f2())
fmt.Println("2")
return
}
func f1(i int) int {
return i
}
func f2() int {
fmt.Println("1")
return 1
}
输出:12
案例二
package main
import (
"fmt"
)
func main() {
defer getFunc()()
fmt.Println("2")
}
func getFunc() func() {
fmt.Println("1")
return func() {
fmt.Println("3")
}
}
输出:123
注意区分传入的是函数变量还是函数
1、函数变量
package main
import (
"fmt"
)
func main() {
defer f3(f2)
fmt.Println("2")
}
func f2() int {
fmt.Println("1")
return 1
}
func f3(f func() int) int {
return f()
}
输出:21
2、函数
package main
import (
"fmt"
)
func main() {
defer f1(f2())
fmt.Println("2")
}
func f1(i int) int {
return i
}
func f2() int {
fmt.Println("1")
return 1
}
输出:12
规则二:defer执行顺序为先进后出
package main
import (
"fmt"
)
func main() {
defer func() {
fmt.Println("3")
}()
defer func() {
fmt.Println("2")
}()
fmt.Println("1")
}
输出:123
规则三:defer可以读取有名返回值
func main() {
i := 1
defer func() {
i
fmt.Println(i)
}()
fmt.Println(i)
}
输出:12
所有规则复合体
package main
import (
"fmt"
)
type msg struct {
Num int
}
func (m *msg) print() {
fmt.Println(m.Num)
}
func main() {
m := new(msg)
m.Num = 1
defer m.print()
defer func(m msg) {
m.print()
}(*m)
m.Num = 2
}
输出:12
到此这篇关于“关于 Golang defer 的使用规则和案例”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
Golang中defer关键字实现原理
Golang defer 使用时的坑
【Go学习】一道简单Golang面试题中关于panic和defer的执行顺序引发的惨案
golangdefer特性姿势还是有必要了解下的!!!
[翻译]Go的Defer、Panic和Recover
defer ,panic,recover
go语言中defer函数
详解defer实现机制(附上三道面试题)
go那些事儿|defer必掌握知识
golang的defer机制详解
上一篇:基本数据类型转换
下一篇:Golang源码探索----GC的实现原理(4)
[关闭]