Go+ panic、defer

简介: 程序的错误有很多种,我们可以在程序的运行当中可以捕获错误,来提高我们程序的交互性,但是并不是所有的错误我们都可以想得到,或者说编译器可以帮我们检查出来的,这就是运行时错误,比如说数组越界、空指针、类型转换异常等,这些错误只有在执行的时候才可以被检测出来。

概述


   程序的错误有很多种,我们可以在程序的运行当中可以捕获错误,来提高我们程序的交互性,但是并不是所有的错误我们都可以想得到,或者说编译器可以帮我们检查出来的,这就是运行时错误,比如说数组越界、空指针、类型转换异常等,这些错误只有在执行的时候才可以被检测出来。


   这种错误一般会导致系统宕机,会造成整个应用的死机,体验感极差,就类似我们在取钱的时候,突然发现我们的钱不够了,然后整个ATM机就直接蓝屏或者关机了,但是在有一些时候宕机是最好的解决方案,可以最大程度降低用户的损失,这就是让程序终止运行的函数——panic()


手动触发panic


   Go+语言可以手动触发panic,也就是手动去触发宕机,直接让程序崩溃,降低用户的损失。他的语法格式如下:


func panic(v interface{})  
复制代码


panic里面的类型可以是任意类型。


panic "crash"
复制代码

1.JPG

 

 运行的时候会报这个错误了,因为我没手动让程序停止运行。


常见的panic


数组(切片)越界


var slice = []int{1, 2, 3, 4} // 定义一个切片
println slice[10] // 访问不存在的下标
复制代码


2.JPG


除以0


   Go+不允许除以0,这个也违背数学常识。


func divide(num1, num2 int) int {
  return num1 / num2
}
println divide(18, 0)
复制代码


3.JPG


使用前没有给map赋初值


我们在使用map之前需要给map赋初值。


var nameMap map[string]string
nameMap["name"] = "zs"
复制代码


defer概述


defer是延迟语句,当我们打开某些资源,比如说数据库连接资源、文件资源、IO资源的时候,我们在使用完或者是遇到错误之前需要提前返回,否则互造成资源泄露或者是占用系统内存过高的问题,有点类似Java的try...catch...finally,finally后常见的操作是释放资源。总结来说,defer的特性是:


  1. defer用于延迟调用。
  2. 如果有多个defer的话。按照栈的特性:先进后出的方式执行。


defer基本用法


defer有点类似于栈,采用的是先进后出的一种模式,先进去的是最后出来。


for i := 0; i < 3; i++ {
  defer println(i)
} // 2 1 0
复制代码


我们可以看到,他输出的结果是2、1、0。defer的作用常见的有三个:


  1. 关闭文件句柄。
  2. 释放各种资源(包括锁资源、连接池资源)。


defer、return、返回值


我们常见的是defer、return、和返回值之间的关系,他们三个执行的顺序是return最先执行同时return负责将结果赋值给返回值。接着defer做一些收尾工作,最后函数携带当前返回值退出。


延迟宕机


有一些时候,我们并不希望出现错误就马上宕机,而是希望在宕机前可以做一点其他事情,这个时候我们可以使用defer语句。


defer println("宕机后要做的事情1")
defer println("宕机后要做的事情2")
panic "宕机了"
复制代码


在宕机之前,先会执行第一句和第二句代码,这个是defer的其中一种基本用法。



相关文章
|
6月前
|
Go
Go语言中defer的执行顺序详解
【2月更文挑战第22天】
99 4
|
3月前
|
存储 Go
掌握 Go 语言的 defer 关键字
掌握 Go 语言的 defer 关键字
|
3月前
|
Go
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
30 0
|
6月前
|
Go 开发者
Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制
Go语言中的`defer`、`panic`和`recover`提供了一套独特的异常处理方式。`defer`用于延迟函数调用,在返回前执行,常用于资源释放。它遵循后进先出原则。`panic`触发运行时错误,中断函数执行,直到遇到`recover`或程序结束。`recover`在`defer`中捕获`panic`,恢复程序执行。注意避免滥用`defer`影响性能,不应对可处理错误随意使用`panic`,且`recover`不能跨goroutine捕获panic。理解并恰当使用这些机制能提高代码健壮性和稳定性。
113 2
|
6月前
|
Java Go 区块链
【Go语言专栏】Go语言中的延迟执行与defer语句
【4月更文挑战第30天】Go语言的延迟执行与defer语句用于资源释放和错误处理。defer通过关键字定义,函数返回时执行,顺序与定义相反。参数在定义时求值。应用包括资源释放、错误处理、成对操作和函数包装,是Go编程的关键特性。
51 0
|
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)
70 0
|
11月前
|
Go
go defer用法_类似与python_java_finially
go defer用法_类似与python_java_finially
60 0
|
11月前
|
存储 Cloud Native Go
Go 语言中 panic 和 recover 搭配使用
Go 语言中 panic 和 recover 搭配使用
|
12月前
|
Cloud Native Go C++
GO 中的 defer 有哪些注意事项?下
GO 中的 defer 有哪些注意事项?下