Go+ panic、defer

举报
XiaoLin_Java 发表于 2022/03/27 21:02:44 2022/03/27
【摘要】 概述    程序的错误有很多种,我们可以在程序的运行当中可以捕获错误,来提高我们程序的交互性,但是并不是所有的错误我们都可以想得到,或者说编译器可以帮我们检查出来的,这就是运行时错误,比如说数组越界、空指针、类型转换异常等,这些错误只有在执行的时候才可以被检测出来。    这种错误一般会导致系统宕机,会造成整个应用的死机,体验感极差,就类似我们在取钱的时候,突然发现我们的钱不够了,然后整个...

概述

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

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

手动触发panic

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

func panic(v interface{})  

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

panic "crash"

image-20211212140632049

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

常见的panic

数组(切片)越界

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

image-20211212143414735

除以0

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

func divide(num1, num2 int) int {
	return num1 / num2
}

println divide(18, 0)

image-20211212144757948

使用前没有给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的其中一种基本用法。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。