Go+ recover、ist comprehension

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: panic用于抛出异常,而recover用于捕获异常,recover是Go+的一个内建函数,recover从字面理解意思是恢复,他可以让你的系统从宕机中恢复过来(捕获异常),虽然程序报错了,但是不会宕机,会进行异常捕获处理,且recover仅仅在只在defer延迟函数有有效。比如说我们的某个服务遇到了某种错误,如果不做任何处理的话,服务端宕机了,客户端会一直保持长连接等待,十分不友好,我们这个时候就需要将异常信息返回给客户端。

recover概述


   panic用于抛出异常,而recover用于捕获异常,recover是Go+的一个内建函数,recover从字面理解意思是恢复,他可以让你的系统从宕机中恢复过来(捕获异常),虽然程序报错了,但是不会宕机,会进行异常捕获处理,且recover仅仅在只在defer延迟函数有有效。比如说我们的某个服务遇到了某种错误,如果不做任何处理的话,服务端宕机了,客户端会一直保持长连接等待,十分不友好,我们这个时候就需要将异常信息返回给客户端。


recover基本用法


基本语法


recover函数如下:


func recover() interface{}
复制代码

 

需要注意的是,只有在defer延迟函数里面,才可以调用recover,我们可以拿到panic的错误信息,让程序恢复到正常的状态。使用err := recover()可以拿到异常对象,进而可以发现错误。


func catchError() {
  //使用defer +recover 来捕获和异常处理
  defer func() {
    err := recover() //recover()是一个内置函数,可以用于捕获异常
    if err != nil { // 如果err异常对象不为空,说明程序报错了
      println "err=", err
      //这里可以执行异常信息捕获的进一步操作
      println "异常被我捕获了"
    }
        // 没有异常执行的代码
  }()
  num1 := 18
  num2 := 0
  res := num1 / num2
  println "res=", res
}
//测试
catchError
复制代码


panic和recover


  1. panic用于抛出异常,意味着如果单独使用panic而不适用cover的话,程序会宕机。
  2. panic和cover联合使用的话,程序不会宕机,在宕机前,执行defer后会执行对应的cover,然后继续执行下一步操作。


列表解析概述


我们在学完for循环以后,会发现有一些操作for循环是很复杂的,比如说从一个列表中取出数据然后追加到另一个列表中,我们需要先for循环遍历出所有的列表然后再去追加,这就是常见的遍历取数的问题,我们可以用列表解析去代码for循环。


for循环解决遍历取数


我们先用for循环来解决遍历取数问题,我们使用列表解析加上cannel就完美解决了这个问题,


name := [...]string{"zs", "ls", "ww", "zl"}
var new_name []string
for i := 0; i < len(name); i++ {
  new_name = append(new_name, name[i])
}
println(new_name)
复制代码


这个只模拟一下for循环解决遍历取数的问题,当然我们也可以使用切片的复制方法来解决。


列表解析


解决基础问题


我们使用列表解析就1-2行解决问题了。


name  := [...]string{"zs", "ls", "ww", "zl"}
new_name := [temp for temp <- name ]
println(new_name)
复制代码


复杂逻辑判断


当然我们还可以做一些复杂的逻辑判断。比如说我们需要去一个切片里面大于3的数字,我们直接加一个判断即可。


mathNum := [...]int {1,2,34,5,6,99}
filterNum := [num for num <- mathNum , num > 3]
println(filterNum)
复制代码


数字运算


给定一个切片,我们想得到这个切片的平方,这就是做一些复杂的数学运算,我们可以这样写。


mathNum := [...]int {1,2,34,5,6,99}
b := [num*num for num <- mathNum ]
println(b)
复制代码


同样,如果我们想要获得大于某个数的平方,直接加条件即可。


mathNum := [...]int {1,2,34,5,6,99}
b := [num*num for num <- mathNum , num > 3]
println(b)
复制代码


其他操作


arr := [1, 2, 3, 4, 5, 6]
new_arr := [[x, y] for x <- arr, x < y for y <- arr, y > 2]
复制代码


这个复杂的操作其实不难理解,给定一个切片,返回类似一个二维数组,左边永远小于右边,右边永远大于2,我们可以使用列表解析去推导这种复杂的计算逻辑。



相关文章
|
3月前
|
Go
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
35 0
|
6月前
|
Go 开发者
Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制
Go语言中的`defer`、`panic`和`recover`提供了一套独特的异常处理方式。`defer`用于延迟函数调用,在返回前执行,常用于资源释放。它遵循后进先出原则。`panic`触发运行时错误,中断函数执行,直到遇到`recover`或程序结束。`recover`在`defer`中捕获`panic`,恢复程序执行。注意避免滥用`defer`影响性能,不应对可处理错误随意使用`panic`,且`recover`不能跨goroutine捕获panic。理解并恰当使用这些机制能提高代码健壮性和稳定性。
130 2
|
6月前
|
Go
Go语言中的异常处理:理解panic与recover
【2月更文挑战第7天】Go语言虽然以简洁和直接错误处理机制而著称,但它也提供了`panic`和`recover`这两个内置函数来处理程序中的异常情况。本文将深入探讨Go语言中的异常处理机制,包括`panic`和`recover`的使用场景、原理以及最佳实践,帮助读者更好地理解如何在Go中处理异常情况。
|
6月前
|
网络协议 BI Go
Go-异常处理(defer recover panic)
Go-异常处理(defer recover panic)
74 0
|
编译器 Go
Go学习笔记-defer、panic、recover分析
Go学习笔记-defer、panic、recover分析
84 1
Go学习笔记-defer、panic、recover分析
|
11月前
|
存储 Cloud Native Go
Go 语言中 panic 和 recover 搭配使用
Go 语言中 panic 和 recover 搭配使用
|
Go 数据库
Go语言学习之 panic 和 recover
Go语言学习之 panic 和 recover
38 0
|
Go
Go异常处理机制panic和recover
Go异常处理机制panic和recover
113 0
|
Go
【Go】panic、recover 区分
【Go】panic、recover 区分
77 0
|
Go 索引
Go panic & recover 使用注意点:
Go panic & recover 使用注意点:
408 0
Go panic & recover 使用注意点: