一、延迟是什么?
•即延迟( 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基础之延时执行的更多相关文章

  1. iOS:延时执行的三种方式

    延时执行的三种方式:performSelectorXXX方法.GCD中延时函数.创建定时器   第一种方式:NSObject分类当中的方法,延迟一段时间调用某一个方法 @interface NSObj ...

  2. iOS中延时执行的几种方式的比较和汇总

    本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...

  3. UITableViewController和延时执行、自定义控件

    1.在UITableViewController中,self.view就是self.tableView, 两个对象的指针地址是一样的 2.自定义类继承UITableViewCell, 重写父类方法 / ...

  4. IOS中延时执行的几种方式的比较

    本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...

  5. mysql定时执行及延时执行,实现类似sql server waitfor功能

    熟悉SQL Server的人都知道,它有一个很有用的功能,waitfor time和waitfor delay,前者表示在某个时间执行,后者表示等待多长时间执行.在我们测试功能和定时执行的时候特别有用 ...

  6. iOS延时执行的四种方法

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. javascript 延时执行函数

    延时执行函数,貌似有些多此一举, 也许还是有点用 记在这儿 var test = { delay : function(lifetime){ var data; setTimeout(function ...

  8. iOS开发之延时执行

    方法1: performSelector(SEL) withObjects:(id) afterDelay:(NSTimeInterval); 方法2: dispatch_after(dispatch ...

  9. (十一)延时执行、圆角(可实现圆形label)、代理设计模式

    延时执行: 使用控件的performSelector...方法,例如用于移除,可以写在一行. [lab performSelector:@selector(removeFromSuperview) w ...

随机推荐

  1. postgresql,postgis,geoserver 发布地图服务,并用.net mvc openlayers3进行显示

    1.所需工具 postgres版本 9.6.1 对应的postgis geoserver 2.8.2 openlayers3 2.将postgres postgis ,geosever安装好,再用如下 ...

  2. shell 循环读取文件及字符串转为数组

    文件/etc/hdocker_config内容如下: 30.72.63.94 30.72.63.95 30.72.63.96 30.72.63.97 /tmp/lasclocker.tar maste ...

  3. Python计算IV值

    更多大数据分析.建模等内容请关注公众号<bigdatamodeling> 在对变量分箱后,需要计算变量的重要性,IV是评估变量区分度或重要性的统计量之一,python计算IV值的代码如下: ...

  4. ARTS-S 在docker中运行本地脚本

    很多情况是本地没有编译环境,但docker中有编译环境.想编译本地代码,就要把本地的代码和编译脚本映射到docker中,脚本如下: docker run \ -it \ -v /Users/usern ...

  5. Linux IO多路复用之epoll网络编程

    前言 本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下: 客户端从标准输入读入一行,发送到服务端 服务端从网络读取一 ...

  6. java笔记 -- 乐观锁与悲观锁

    何谓乐观锁和悲观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展.这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人. 悲观锁 - ...

  7. Vue-router的实现原理

    参考博客:https://www.jianshu.com/p/4295aec31302 参考博客:https://segmentfault.com/a/1190000015123061

  8. 【原创】005 | 搭上SpringBoot请求处理源码分析专车

    前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往Spring Boot请求处理源码分析专车,主要用来分析S ...

  9. 【CentOS7】curl命令

    [CentOS7]curl命令 转载: 参考 https://www.thegeekstuff.com/2012/04/curl-examples/ http://www.cnblogs.com/gb ...

  10. Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

    JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存.它在JVM启动的时候被创建.对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收. 堆内存是由存活和死亡的对象组成的.存活的对象是应 ...