GO基础之延时执行
一、延迟是什么?
•即延迟( 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恐慌了")
}
GO基础之延时执行的更多相关文章
- iOS:延时执行的三种方式
延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器 第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...
- iOS中延时执行的几种方式的比较和汇总
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- UITableViewController和延时执行、自定义控件
1.在UITableViewController中,self.view就是self.tableView, 两个对象的指针地址是一样的 2.自定义类继承UITableViewCell, 重写父类方法 / ...
- IOS中延时执行的几种方式的比较
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- mysql定时执行及延时执行,实现类似sql server waitfor功能
熟悉SQL Server的人都知道,它有一个很有用的功能,waitfor time和waitfor delay,前者表示在某个时间执行,后者表示等待多长时间执行.在我们测试功能和定时执行的时候特别有用 ...
- iOS延时执行的四种方法
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- javascript 延时执行函数
延时执行函数,貌似有些多此一举, 也许还是有点用 记在这儿 var test = { delay : function(lifetime){ var data; setTimeout(function ...
- iOS开发之延时执行
方法1: performSelector(SEL) withObjects:(id) afterDelay:(NSTimeInterval); 方法2: dispatch_after(dispatch ...
- (十一)延时执行、圆角(可实现圆形label)、代理设计模式
延时执行: 使用控件的performSelector...方法,例如用于移除,可以写在一行. [lab performSelector:@selector(removeFromSuperview) w ...
随机推荐
- 【Python成长之路】python 基础篇 -- 装饰器【华为云分享】
[写在前面] 有时候看到大神们的代码,偶尔会用到@来装饰函数.当时查了资料,大致了解装饰器一般用于在不改变原函数的基础上 ,对原函数功能进行修改/增强.使用场景是:日志级别设置.权限校验.性能测试等. ...
- Python中的Tcp协议应用之TCP服务端-线程版
利用线程实现,一个服务端同时服务多个客户端的需求. TCP服务端-线程版代码实现: import socket import threading def handle_client_socket(ne ...
- Java修炼——暂停线程的四个方法
线程的获取方法:Thread.currentThread() 后面可以加上获取线程的名字 .getName() 这样就成功获取到了线程的名字. Sleep会导致当前线程休眠一定 ...
- Spring Boot结合Mybatis
pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...
- 基于 H5 + WebGL 实现 3D 可视化地铁系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...
- Python3 面向对象进阶1
目录 组合 概念 目的 实现方式 封装 概念 目的 实现方式 访问限制 概念 目的 实现方式 property 概念 目的 实现方式 多态 概念 目的 抽象类 概念 目的 实现方法 鸭子类型 组合 概 ...
- 通过EF操作Sqlite时遇到的问题及解决方法
1.使用Guid作为字段类型时,能存,能查,但是作为查询条件时查询不到数据 解决方法:连接字符串加上;binaryguid=False
- 使用docker安装虚拟机并打开ssh连接
一.需求 最近有个需求,要连接很多个linux系统进行测试软件功能,但是我这里只有几个虚拟机,所以需要使用docker来安装几十个或者上百个虚拟机来进行测试. 二.安装docker 这里就不演示怎么安 ...
- AQS系列(四)- ReentrantReadWriteLock读写锁的释放锁
前言 继续JUC包中ReentrantReadWriteLock的学习,今天学习释放锁. 一.写锁释放锁 入口方法 public void unlock() { sync.release(1); } ...
- MySql全文检索使用详解
实际项目中经常会有一个字段存储多个值用逗号分隔的场景,当分开查询的时候,使用模糊查询会非常影响效率.mysql提供了全文检索函数可以有效解决这一问题: 1.数据结构 ID CODE MSG 1 111 ...