golang defer关键字
2024-10-21 05:53:47
defer关键字的作用
defer 会在当前函数或者方法返回(return)之前执行传入的函数。它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。
在go语言中,程序有defer语句并不会马上执行,而是会进入一个栈,函数return前,会按先进后出
的顺序执行。也说是说最先被定义的defer语句最后执行。先进后出的原因是后面定义的函数可能会依赖前面的资源,自然要先执行;否则,如果前面先执行,那后面函数的依赖就没有了。
遇到defer关键字,会将后面的代码语句压入栈中,也会将相关的值同时拷贝入栈中,不会随着函数后面的变化而变化。
defer触发的时机:
- 所在函数return时。
- 所在函数执行结束时。
- 所在goroutine发生恐慌(panic)时。
package main
import (
"fmt"
)
func main() {
fmt.Println(testSum(20, 30))
}
func testSum(num1 int, num2 int) int {
defer fmt.Printf("num1的值为:%v\n", num1) //最先进入栈中,按照栈的特性,先进后出,retrun之前最后输出
defer fmt.Printf("num2的值为:%v\n", num2) //最后进入栈中,按照栈的特性,先进后出,retrun之前最先输出
num1 += 10
num2 += 10
var sum int
sum = num1 + num2
fmt.Printf("sum的值为:%v\n", sum) //先输出
return sum //testSum中最后返回
}
执行结果
sum的值为:70
num2的值为:30
num1的值为:20
70
最新文章
- javascript继承笔记
- 演示一个OLS进行数据访问控制的示例
- html+css创建提示框
- FROM_UNIXTIME()和UNIX_TIMESTAMP()函数的区别
- C#:WPF绘制问题
- 创建view
- IOS设备上网页中的页面滚动效果模拟
- MVC动态绑定下拉框
- JavaProperties类、序列化流与反序列化流、打印流、commons-IO整理
- loadrunner 技巧-模拟Run Logic中的随机Action运行
- 【经验分享】我经历的几门MOOC
- [转帖] k8s kubectl 命令行技巧
- python 通过 pymysql模块 操作 mysql 数据库
- elasticSearch6源码分析(2)模块化管理
- 初识oracle重做日志文件
- phpmyadmin 配置方法
- thinkphp数据查询方法总结select ,find,getField,query
- (android实战)破解apk
- 一张图说清楚SQL的Join
- BZOJ 1202 狡猾的商人 差分约束or带权并查集
热门文章
- JavaScript 图像压缩
- [Untiy]贪吃蛇大作战(二)——规则界面
- [剑指Offer]3.数组中重复的数字
- cordova第三方插件的创建,修改以及调试指南---真机调试,浏览器调试
- 今日实际操作----Dart Mac开发与运行环境配置 配置.bash_profile
- Mybatis的学习与理解
- WAF Bypass 介绍与实战
- css当文字过长时,显示省略号
- js的map、filter的用法
- PostgreSQL cache lookup failed for type XXXX 错误