说明:

Go语言中函数的return不是原子操作, 在底层分为两步来执行;

第一步: 返回值赋值

第二步: 真正的return返回

函数中如果存在defer, 那么defer执行的时机是在第一步和第二步之间;

例子1:
func f1() int {x := 5defer func(){x++}()return x
}
//return:
//第一步: 将x赋值给匿名返回变量ret
//进行defer操作, 修改x的值, x不是真正的返回值
//第二步: 返回匿名变量ret
//输出为:5
例子2:
func f2()(x int){defer func(){x++}()return 5
}
//返回变量为x
//return:
//第一步: 给x变量赋值5   x = 5
//defer操作, 修改x的值  x = 6
//第二步: 返回变量x
//输出: 6
例子3:
func f3()(y int){x := 5defer func(){x++}()return x
}//return:
//第一步: 给返回变量y赋值   y = x = 5
//defer: 修改x的值, x = 6
//第二步: 返回变量y   y = 5
例子4:
func f4(x int){defer()(x int){x++}(x)return 5
}
//return:
//第一步: 给返回变量x赋值  x = 5
//defer: 将x传入defer  是值传递  修改copy后的x的值 x` = 6  x = 5
//第二步: 返回变量x  x = 5
//输出: 5

func与defer相关推荐

  1. golang善用go func和defer

    一.error与panic: error:可预见的错误 panic:不可预见的错误,panic一般通过defer中的recover()捕获 对于有风险的代码,若发生panic则会导致程序异常退出,例如 ...

  2. Go 学习笔记(17)— 函数(03)[defer 定义、defer 特点、defer 释放资源]

    1. defer 定义 Go 函数的关键字 defer 可以提供注册多个延迟调用,只能出现在函数内部,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,这些调用遵循 ...

  3. Go基础编程:延迟调用defer

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本篇文章所讲的就是go编程中的延迟调用defer,希望对社区的成员有较多的帮助. 1 defer作用 关键字defer ...

  4. golang源码分析:defer流程分析

    defer defer是golang中使用的延迟调用的函数,该函数的使用场景就是如果函数执行出错(panic),也能够通过recover方式进行捕捉错误并将出错时的一些资源进行回收,如果在性能有要求的 ...

  5. GO语言教程4:defer(延迟语句)详解

    文章目录 1.defer语句格式 2.defer执行的时间 3.defer语句的作用 4.defer语句执行的顺序 5.defer与return的value之间的关系 6.用defer进行代码跟踪 7 ...

  6. Go笔记-错误处理和defer

    为什么80%的码农都做不了架构师?>>> error error类型的声明可在builtin包中查看: type error interface {Error() string } ...

  7. Golang之轻松化解defer的温柔陷阱

    什么是defer? defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行. defer语句通常用于 ...

  8. Go圣经-学习笔记之defer和异常处理

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇 Go圣经-学习笔记之函数值(二) 下一篇 Go圣经-学习笔记之方法 可变参数 形参数量可变的函数称为可变参数函数.使用 ...

  9. Go 语言 defer recover panic 简单例子

    为什么80%的码农都做不了架构师?>>>    // Mydef project main.go package mainimport ("log" )func ...

最新文章

  1. python数组用sum求和_对python中array.sum(axis=?)的用法介绍
  2. html 怎么使用http请求数据类型,HTTP请求方式中8种请求方法(简单介绍)
  3. 利用doc命令启动与关闭服务
  4. TensorFlow应用实战-17-Qlearning实现迷宫小游戏
  5. AI科学计算领域的再突破,昇思MindSpore做“基石”的决心有多强?
  6. 云原生游戏《云联物语》揭开神秘面纱 云鹭科技温向东带你深度了解云原生游戏领域...
  7. 数据库基础知识——互动百科
  8. 非递归中序遍历---算法导论12.1-3
  9. 温度采集系统(开源 原理图、PCB文件+源码+云平台+app端设计方案)
  10. CTF密码学之Base64,Base32,Base16
  11. sl400通过ac无法连接psk加密无线网络
  12. 超级经典的Word技巧
  13. SAP GUI750 双击创建子例程没反应,补丁下载
  14. [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
  15. 学习笔记:CentOS7学习之十六:LVM管理和ssm存储管理器使用
  16. 学习笔记-Ramnit 蠕虫分析
  17. 文献类型参考文献的文献标识码
  18. vite 设置启动Network 为本地ip
  19. Map map=new HashMap(); 为什么是这样
  20. matlab中匿名(Anonymous)函数及bsxfun函数

热门文章

  1. Python AI:如何构建神经网络并进行预测
  2. Norton PartitionMagic 8.0 硬盘处理软件
  3. 第十七届全国大学生智能车竞赛华南赛区比赛成绩
  4. GLC国锂科技一场影响人类生活的大变革
  5. centos7同网段下文件互传
  6. 小学计算机·第2册,小学第二册《信息技术》教学计划
  7. 计算机怎么改鼠标标志,电脑鼠标图标怎么改
  8. 百度贴吧顶帖,没了发发久依然有办法!
  9. Verizon 48.3亿美元收购雅虎互联网资产
  10. java接口作为参数_JAVA:将类、抽象类、接口当成方法的参数传入