首页 > 其他分享 >Golang 中 defer panic recover 简单使用

Golang 中 defer panic recover 简单使用

时间:2024-08-08 17:07:42浏览次数:13  
标签:defer 函数 fmt Golang Println recover panic

Golang defer、panic、recover

defer

defer 语句用于延迟执行一个函数调用,直到包含该 defer 语句的函数执行完毕。defer 语句通常用于释放资源、关闭文件、解锁互斥锁等操作。

defer 语句的执行顺序是后进先出,即最后被 defer 的语句最先执行。例如:

func main() {
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    defer fmt.Println("defer 3")
    fmt.Println("main")
}

输出结果为:

main
defer 3
defer 2
defer 1

panic

panic 是 Go 语言中的一个内置函数,用于触发一个运行时错误。当程序执行到 panic 函数时,会立即停止当前函数的执行,并开始执行该函数中所有 defer 语句。然后,程序会沿着调用栈向上传播 panic,直到找到一个 recover 函数来捕获 panic,或者程序终止。

panic 函数通常用于处理不可恢复的错误,例如数组越界、空指针引用等。

recover 是 Go 语言中的一个内置函数,用于捕获 panic。当程序执行到 recover 函数时,会停止 panic 的传播,并返回 panic 的值。如果程序没有 panic,则 recover 函数返回 nil。

recover 函数通常用于处理 panic,例如在 defer 语句中捕获 panic,并执行一些清理操作。例如:

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("panic:", err)
        } else {
            fmt.Println("no panic")
        }
    }()
    panic("something wrong")
}

输出结果为:

panic: something wrong

注:panic 后面的语句都不会在执行包括调用的函数

func main() {
    defer func() {
		if err := recover(); err != nil {
			fmt.Println("main recover", err)
		}
	}()
	c := testPanic(3, 3)
	fmt.Println("继续执行", c)
        
}

func testPanic(a int, b int) (t int) {

	if a%b == 0 {
		panic("error ---------")
	} else {
		return a % b
	}

}

输出结果为:

main recover error ---------

标签:defer,函数,fmt,Golang,Println,recover,panic
From: https://www.cnblogs.com/yidejiyi/p/18349316

相关文章

  • golang基础-工作区和gopath
    gobuild命令一些可选项的用途和用法在运行gobuild命令的时候,默认不会编译目标代码包所依赖的那些代码包。当然,如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。如果要强制编译它们,可以在执行命令的时候加入标记-a。此时,不但目标代码包总是会被编......
  • Golang zap 日志简单实用
    zapGolang第三方库记录日志Zap是非常快的、结构化的、分日志级别的Go日志库功能简介可以配置日志输入格式JSON和普通文本可以配置日志输出位置控制台和文件可以配置日志级别debug、info、warn、error安装goget-ugo.uber.org/zap基本使用logger,err:=z......
  • Misc_XCTF_WriteUp | Recover-Deleted-File
    题目恢复磁盘并且找到FLAG.分析?看看压缩包属性,这棉花糖泡水了吧(看来是需要恢复了,搜索引擎了解到一款Linux下的数据恢复工具extundelete,安装方法及参考放在文末了。下载的压缩包整个拖进Linux,gzip-dc297795634cb4f6e8e1d88be044ec0c4.gz解压缩,得到一个文件:fls......
  • golang sliver二次开发自定义命令(格式乱后面再调)
    准备工作sliver客户端和服务端之间命令的通信采用的grpc,服务端和和植入程序通信使用的protobuf,所以在开发之前需要了解grpc和protobuf,相关文档:https://jergoo.gitbooks.io/go-grpc-practice-guide/content/chapter2/hello-grpc.htmlhttps://jergoo.gitbooks.io/go-grpc-pra......
  • 实现区块链golang(一)
    golangpackagemainimport("bytes""crypto/sha256""fmt")typeBlockChainstruct{blocks[]*Block}typeBlockstruct{Hash[]byteData[]bytePrevHash[]byte}func(b*Block)De......
  • 【Golang 面试 - 进阶题】每日 3 题(十九)
    ✍个人博客:Pandaconda-CSDN博客......
  • 实现一个终端文本编辑器来学习golang语言:第二章Raw模式下的输入输出
    从第二章开始,在每个小节的最后都会有一些代码实操作业,你可以选择自己完成(比较推荐),再对照我的实现方式,当然也可以直接看我的代码实现。不过,之后的各个功能实现,我都会基于我先前的代码实现版本,在它的基础上进行扩展。首先,我们先来解决第一章遗留的第一个问题:输入数据会被stdin缓存......
  • go pkg包名,如何在pkg.go.dev发布golang软件包, package包名, import包名, git库名, g
    golang的包名在不同的地方作用不同,用途不同。在我们通过pkg.go.dev发布自己的包的时候,了解这些包名和他们的用途就很有必要了。下面我们以go语言中的pkg库 github.com/tekintian/strutils为例说明各种名称的区别和用途。如何在pkg.go.dev发布golang软件包要在pkg.go.dev发......
  • 实现一个终端文本编辑器来学习golang语言:第一章项目构建
    欢迎!这个系列的博文会带你使用golang语言来编写一个你自己的文本编辑器。更多介绍见https://www.cnblogs.com/Ama2ingYJ/p/18340634这里我把我们的文本编辑器项目命名为zedterm。首先第一步自然是初始化golang工程gomodinitzedterm作为文本编辑器,其中重要的一个工作便是......
  • 实现一个终端文本编辑器来学习golang语言
    欢迎!这个系列的博文会带你使用golang语言来编写一个你自己的文本编辑器。首先想说说写这个系列文章的动机。其实作为校招生加入某头部互联网大厂一转眼已经快4年了。可以说该大厂算是比较早的用golang语言作为主要后端开发技术栈的公司了,绝大部分后端项目的语言选型都是golang......