golang 学习(二十)defer 、panic、recover 用法,以及异常处理

defer 、panic、recover 用法,以及异常处理

defer 延迟执行语句

import (
	"errors"
	"fmt"
	"testing"

func TestDefer(t *testing.T) {
	//defer 延迟执行语句
	fmt.Println("start")
	defer fmt.Println("go")
	defer fmt.Println("go")
	defer fmt.Println("Let's")
	defer fmt.Println("end")
	//start
	//end
	//Let's
	//go
	//go
}

defer在命名返回值和匿名返回方法中表现不一样

func fn1() (x int) {
	x = 5
	defer func() {
		x++
	}()
	return x //6
}
func fn2() int {
	var a int = 5
	defer func() {
		a++
	}()
	return a //5
}
func fn3() (y int) {
	x := 5
	defer func() {
		x++
	}()
	return x //5
}
func fn4() (x int) {
	defer func(x int) {
		x++
	}(x)
	return 5 //5
}

func calc(str string, a, b int) int {
	sum := a + b
	fmt.Println(str, a, b, sum)
	return sum
}

在这里插入图片描述

defer 注册要延迟执行方法时,该方法所有的参数都需要确定其值

func calc(str string, a, b int) int {
	sum := a + b
	fmt.Println(str, a, b, sum)
	return sum
}
func TestCalc(t *testing.T) {
	x := 1
	y := 2
	defer calc("AA", x, calc("A", x, y))
	x = 10
	defer calc("BB", x, calc("B", x, y))
}

1.注册顺序
defer calc(“AA”, x, calc(“A”, x, y))
defer calc(“BB”, x, calc(“B”, x, y))
2.执行顺序
defer calc(“BB”, x, calc(“B”, x, y))
defer calc(“AA”, x, calc(“A”, x, y))
3.执行结果
A 1 2 3
B 10 2 12
BB 10 12 22
AA 1 3 4

panic/recover 以及异常处理

panic/recover 模式来处理错误
panic 可以在作任何地方引发,但recover 只有在defer 调用的方法中有效

func test1() {
	fmt.Println("异常开始")
}
func test2() {
	defer func() {
		err := recover() //收集异常
		if err != nil {
			fmt.Println("err:", err)
		}
	}()
	panic("这里有错误") //抛了异常
}
func TestException(t *testing.T) {
	test1()
	test2()
	fmt.Println("异常测试结束")
}

执行结果
在这里插入图片描述

模拟读取文件失败,异常处理

func TestException(t *testing.T) {
	doErr() //文件不存在
}
func readfile(f string) error {
	if f == "main.go" {
		return nil
	} else {
		return errors.New("文件不存在") //注意引入error包
	}
}
func doErr()  {
	defer func() {
		e := recover()
		fmt.Println(e) //文件不存在
	}()
	err := readfile("demo.gp")
	if err !=nil{
		panic(err)
	}
}

热门文章

暂无图片
编程学习 ·

关于Error:java: Compilation failed: internal java compiler error的解决方案

文章目录事故现场分析解决方案最终结果 事故现场分析 使用Idea导入新项目或升级idea或新建项目时会出现以上异常信息,导致这个错误的原因主要是因为jdk版本问题,此处有两个原因,一个是编译版本不匹配,一个是当前项目jdk版本不支持 常规分析:看一下compile,原来真的是错在…
暂无图片
编程学习 ·

Qt QTreeWidget的级联选中

在使用QTreeWidget显示文件树时,需要对树的节点做一些功能的限制:勾选某一节点时,该节点的子项自动全部选中 子项部分勾选时,父节点状态为部分勾选 子项全部勾选时,父节点自动设置勾选首先,查看了Qt文档,发现竟然没有提供这个功能,所以自己写了一个简单的例子。 先看效…
暂无图片
编程学习 ·

深度学习在美团推荐平台排序中的运用

美团作为国内最大的生活服务平台,业务种类涉及食、住、行、玩、乐等领域,致力于让大家吃得更好,活得更好,有数亿用户以及丰富的用户行为。随着业务的飞速发展,美团的用户和商户数在快速增长。在这样的背景下,通过对推荐算法的优化,可以更好的给用户提供感兴趣的内容,帮…
暂无图片
编程学习 ·

Python之OpenCV的学习(一)

一.安装 打开Pycharm:File -> Settings -> Project:xxxx下的Project Interpreter,如图所示然后,点击右边的加号进行搜索点击左下角Install Package即可 如果搜索不出来,可以看一下是不是pip源的问题 点击Manage Repositories我使用的是豆瓣pip源:http://pypi.douba…
暂无图片
中恒嘉业 ·

关于主从复制的超详细解析(全)

目录前言1. 主从复制1.1 方式2. Mysql的主从复制2.1 一主一从2.1.1 window和linux通讯2.1.2 linux和linux的通讯2.2 双主双从3. Redis的主从复制3.1 哨兵模式3.2 java代码结合前言 主要介绍mysql的主从复制以及redis的主从复制 能由浅入深的明白原理以及如何操作 再者&#xf…
暂无图片
郑州普通话 ·

apm性能监控系统,kotlindata类

进阶之路 为何会想起写这么一篇文章呢,一方面很多程序员对于技术精进仍然十分困惑,不知道该如何学习进阶,以至于提前陷入中年危机的困惑之中,作为一名Android开发近十年的老码农或许可以分享一些自己的心得体会,刚好这几天工作需要,组内想规划 Android 技术路线,简单来说…
暂无图片
郑州普通话 ·

将Jetson XavierNX的Ubuntu系统迁移至到nvme硬盘上

第一步:sudo mke2fs -t ext4 /dev/nvme0n1p1 #格式化分区 第二步:将eMMC / SD卡的rootfs复制到SSD git clone https://github.com/jetsonhacks/rootOnNVMe cd rootOnNVMe #进入目录 ./copy-rootfs-ssd.sh #执行复制脚本第三步:安装启动脚本…
暂无图片
代理记账 ·

在web应用中发送和接收Jakarta消息

Running the websimplemessage Example To Package and Deploy websimplemessage Using Maven _1、Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server). _2、In a terminal window, go to: tut-install/examples/jms/websimp…
暂无图片
cgfy ·

C++学习日记2——函数、封装、对象特性

一、函数 1.1 函数默认参数 1.1.1 简介 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 1.1.2 语法 返回值类型 函数名 (参数 默认值) {} 1.1.3 代码 #include <iostream> using namespace std;// 函数的默认参数 int func(int a, int b 20, int c 30…
暂无图片
coreui ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
coreui ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
未来博客 ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
未来博客 ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
建站日记 ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
建站日记 ·

NLP聊天机器人原理(seq2seq模型)

一、seq2seq模型 1.概念 seq2seq是一个Encoder-Decoder结构的网络&#xff0c;它的输入是一个序列&#xff0c;输出也是一个序列。Encoder中将一个可变长度的信号序列变为固定长度的向量表达&#xff0c;Decoder将这个固定长度的向量变成可变长度的目标的信号序列。这个结构最…
暂无图片
mfbz ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
mfbz ·

全渠道会员通-天猫会员通3: 会员运营内容准备

在天猫会员通技术对接开发过程中&#xff0c;为了通知存量会员的通知工作&#xff0c;发挥会员通的优势&#xff0c;品牌需要做好以下事宜&#xff1a; 会员体系暂停公告&#xff1a;因会员通技术升级期间&#xff0c;会员服务将被暂停&#xff0c;店铺tab中会员入口将被下线&…
暂无图片
珊珊日记 ·

C# 执行Javascript脚本

c#教程https://www.xin3721.com/eschool/CSharpxin3721/ 前一阵子使用C#编写SCXML状态机&#xff0c;需要解析EMCScript表达式&#xff0c;使用了Jint库&#xff08;https://github.com/sebastienros/jint/)&#xff0c;当时感觉与C#之间的数据转换不是很方便。这两天有时间又关…
暂无图片
珊珊日记 ·

第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛

A.大学期末现状 题目描述 作为一名大学生的你&#xff0c;现在又到了期末查成绩的时候&#xff0c;当你的成绩大于等于60时请输出“jige,haoye!”,否则输出"laoshi,caicai,laolao"。 输入描述: 一行&#xff0c;一个整数x代表你的成绩&#xff08;0<x<100&a…