经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
GO基础之延时执行
来源:cnblogs  作者:小禾点点  时间:2019/11/13 8:57:02  对本文有异议

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


一、延迟函数

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

  1. package main
  2. import "fmt"
  3. import (
  4. "base"
  5. )
  6. func main() {
  7. defer funcA()
  8. funcB()
  9. defer funcC()
  10. fmt.Println("main over...")
  11. }
  12. func funcA() {
  13. fmt.Println("这是funcA")
  14. }
  15. func funcB() {
  16. fmt.Println("这是funcB")
  17. }
  18. func funcC() {
  19. fmt.Println("这是funcC")
  20. }
View Code

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

  1. package main
  2. import "fmt"
  3. type person struct {
  4. firstName, lastName string
  5. }
  6. func (p person) fullName() {
  7. fmt.Printf("%s %s", p.firstName, p.lastName)
  8. }
  9. func main() {
  10. p := person{"Steven" , "Wang"}
  11. defer p.fullName()
  12. fmt.Print("Welcome ")
  13. }
View Code

带参数的defer函数

  1. package main
  2. import "fmt"
  3. func main() {
  4. a := 5
  5. b := 6
  6. defer printAdd(a, b, true)
  7. a = 10
  8. b = 7
  9. printAdd(a, b, false)
  10. }
  11. func printAdd(a, b int, flag bool) {
  12. if flag {
  13. fmt.Printf("延迟执行函数printAdd() ,参数a,b分别为%d, %d , 两数之和为:%d\n", a, b, a+b)
  14. } else {
  15. fmt.Printf("未延迟执行函数printAdd() ,参数a,b分别为%d, %d , 两数之和为:%d\n", a, b, a+b)
  16. }
  17. }
View Code

二、宕机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的输入值,并且恢复正常的执行

 

  1. package main
  2. import "fmt"
  3. func main() {
  4. funcA()
  5. funcB()
  6. funcC()
  7. fmt.Println("main over")
  8. }
  9. func funcA() {
  10. fmt.Println("这是funcA")
  11. }
  12. func funcB() {
  13. defer func() {
  14. if msg := recover(); msg != nil {
  15. fmt.Println("恢复啦,获取recover的返回值:", msg)
  16. }
  17. }()
  18. fmt.Println("这是funcB")
  19. for i := 0; i < 10; i++ {
  20. fmt.Println("i:", i)
  21. if i == 5 {
  22. //panic("funcB恐慌啦")
  23. }
  24. }
  25. }
  26. func funcC() {
  27. defer func() {
  28. fmt.Println("执行延迟函数")
  29. msg := recover()
  30. fmt.Println("获取recover的返回值:", msg)
  31. }()
  32. fmt.Println("这是funcC")
  33. panic("funcC恐慌了")
  34. }
View Code

 

原文链接:http://www.cnblogs.com/jalja/p/11846027.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号