一、延迟是什么?
•即延迟( defer)语句,延迟语句被用于执行一个函数调用,在这个函数之前,延迟语句返回。

一、延迟函数

1、可以在函数中添加多个defer语句。
•当函数执行到最后时,这些defer■语句会按照逆序执行,最后该函数返回。特别是当你在进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然很容易造成资源泄露等问题
•如果有很多调用defer,那么defer是采用后进先出模式
•在离幵所在的方法时,执行(报错的时候也会执行)

package main

import "fmt"
import (
"base"
)
func main() {
defer funcA()
funcB()
defer funcC()
fmt.Println("main over...")
} func funcA() {
fmt.Println("这是funcA")
} func funcB() {
fmt.Println("这是funcB")
} func funcC() {
fmt.Println("这是funcC")
}

延迟方法(defe的数据结构类似于栈)

package main

import "fmt"

type person struct {
firstName, lastName string
} func (p person) fullName() {
fmt.Printf("%s %s", p.firstName, p.lastName)
} func main() {
p := person{"Steven" , "Wang"}
defer p.fullName()
fmt.Print("Welcome ")
}

带参数的defer函数

package main

import "fmt"

func main() {
a :=
b :=
defer printAdd(a, b, true)
a =
b =
printAdd(a, b, false)
} func printAdd(a, b int, flag bool) {
if flag {
fmt.Printf("延迟执行函数printAdd() ,参数a,b分别为%d, %d , 两数之和为:%d\n", a, b, a+b)
} else {
fmt.Printf("未延迟执行函数printAdd() ,参数a,b分别为%d, %d , 两数之和为:%d\n", a, b, a+b)
}
}

二、宕机panic和宕机恢复recover

(―)、panic和recover机制
1、概述:
• panic:词义__恐慌recover:"恢复_■
• Go没有像Java那样的异常机制,它不能抛出异常,而是使用了 panic和recover机制。一定要记住,应当把它作为最后的手段来使用,也就是说,我们的代码中应当没有,或者很少有panic这样的东西。
• go语言利用panicO, recover(),实现程序中的极特殊的异常处理
〇 panicO,让当前的程序进入恐慌,中断程序的执行
〇 recoverO,让程序恢复,必须在defer函数中执行
〇 Panics—个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。
〇当函数 F调用panic,函数 F的执行被中断,但是F中的延迟函数会正常执行,然后F返回到调用它的地方。在调用的地方,F的行为就像调用了panic。这一过程继续向上,直到发生panic的goroutine中所有调用的函数返回,此时程序退出。
〇恐慌可以直接调用panic产生。也可以由运行时错误产生,例如访问越界的数组。
〇 Recover是一个内建的函数,可以让进入令人恐慌的流程中的goroutine恢复过来。
〇 recover仅在延迟函数中有效。在正常的执行过程中,调用recover会返回nil,并且没有其它任何效果。如果当前的goroutine陷入恐慌,调用recover•可以捕获到panic的输入值,并且恢复正常的执行

package main

import "fmt"

func main() {
funcA()
funcB()
funcC()
fmt.Println("main over")
} func funcA() {
fmt.Println("这是funcA")
} func funcB() {
defer func() {
if msg := recover(); msg != nil {
fmt.Println("恢复啦,获取recover的返回值:", msg)
} }()
fmt.Println("这是funcB")
for i := ; i < ; i++ {
fmt.Println("i:", i)
if i == {
//panic("funcB恐慌啦")
}
}
} func funcC() {
defer func() {
fmt.Println("执行延迟函数")
msg := recover()
fmt.Println("获取recover的返回值:", msg)
}()
fmt.Println("这是funcC")
panic("funcC恐慌了")
}

最新文章

  1. EntityFramwork入门
  2. BGP--边界网关协议
  3. C#.Net理论
  4. Html.ActionLink 几种重载方式说明及例子
  5. php字符操作
  6. 在hive中直接对timestamp类型取max报错
  7. C# winForm资源文件实现多语言切换
  8. Python 字符串字典内置函数&amp;方法
  9. Ajax - Apache安装配置
  10. 面向切面编程 ( Aspect Oriented Programming with Spring )
  11. springboot之配置文件
  12. HDU 1880 魔咒词典 (Hash)
  13. Unity 2D入门基础教程之僵尸先生
  14. nyoj737石子合并(一)
  15. Python学习笔记系列——高阶函数(map/reduce)
  16. CDOJ 1048 Bob&#39;s vector(快速幂+三分法)
  17. python 操作Excel表格,解压zip包,压缩zip包,目录遍历
  18. [Alpha]Scrum Meeting#5
  19. 基于jwt和角色的访问控制方案-从0开始
  20. [UNIX]UNIX常用命令总结

热门文章

  1. css练习一
  2. RAC环境查询JOB正在运行的信息
  3. [ch05-02] 用神经网络解决多变量线性回归问题
  4. CollectionView常用的布局方式总结
  5. rbac结合ssm实现权限分配和管理
  6. 记录我的 python 学习历程-Day05 字典/字典的嵌套
  7. (重点)Python深入之Python内存管理机制你会吗?
  8. 用FPGA设计LCD 转 VGA
  9. 轻轻松松学会 DRF Django REST framework
  10. cookie、session和token那些事