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

最新文章

  1. javascript继承笔记
  2. 演示一个OLS进行数据访问控制的示例
  3. html+css创建提示框
  4. FROM_UNIXTIME()和UNIX_TIMESTAMP()函数的区别
  5. C#:WPF绘制问题
  6. 创建view
  7. IOS设备上网页中的页面滚动效果模拟
  8. MVC动态绑定下拉框
  9. JavaProperties类、序列化流与反序列化流、打印流、commons-IO整理
  10. loadrunner 技巧-模拟Run Logic中的随机Action运行
  11. 【经验分享】我经历的几门MOOC
  12. [转帖] k8s kubectl 命令行技巧
  13. python 通过 pymysql模块 操作 mysql 数据库
  14. elasticSearch6源码分析(2)模块化管理
  15. 初识oracle重做日志文件
  16. phpmyadmin 配置方法
  17. thinkphp数据查询方法总结select ,find,getField,query
  18. (android实战)破解apk
  19. 一张图说清楚SQL的Join
  20. BZOJ 1202 狡猾的商人 差分约束or带权并查集

热门文章

  1. JavaScript 图像压缩
  2. [Untiy]贪吃蛇大作战(二)——规则界面
  3. [剑指Offer]3.数组中重复的数字
  4. cordova第三方插件的创建,修改以及调试指南---真机调试,浏览器调试
  5. 今日实际操作----Dart Mac开发与运行环境配置 配置.bash_profile
  6. Mybatis的学习与理解
  7. WAF Bypass 介绍与实战
  8. css当文字过长时,显示省略号
  9. js的map、filter的用法
  10. PostgreSQL cache lookup failed for type XXXX 错误