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)
	}
}

热门文章

暂无图片
编程学习 ·

yum本地云搭建

yum Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。 yum仓库配置文…
暂无图片
编程学习 ·

2.7 网络抓包

1.简介 抓包是指对网络传输中发送与接收的数据包进行拦截、重发、编辑和转存的操作。 在开发网络爬虫时,给定URL,开发者必须清楚客户端是如何向服务器发送请求的,以及客户端发出请求后服务器返回的数据是什么。只有了解这些内容,开发者才能在程序中拼接URL,针对服务返回的…
暂无图片
编程学习 ·

dexjar用法

将dex文件转换成jar文件: 直接将dex文件拖进d2j-dex2jar.bat 或者 用cmd进行转换将jar文件转换成dex文件: 直接将jar文件拖进d2j-jar2dex.bat 或者 用cmd进行转换
暂无图片
编程学习 ·

JS 中的展开运算符你了解多少 ?

什么是展开运算符 (...)?展开运算符 :允许一个表达式在某处展开。展开运算符在多个参数(用于函数调用)或多个元素(用于数组字面量)或者多个变量(用于解构赋值)等地方可以使 用,作用就是 展开数组或字符串为一个新数组。注意 : 展开运算符不能用在对象当中,因为目前…
暂无图片
编程学习 ·

聚焦Java性能优化 打造亿级流量秒杀系统【学习笔记】06_交易性能优化技术之缓存库存

文章目录本章目标7-1 交易性能瓶颈7-2 交易验证优化7-3 活动缓存库存方案一(重点)库存行锁优化扣减库存缓存化(方案一)异步同步数据库(方案二)异步消息队列rocketmq库存数据库最终一致性保证7-5 活动缓存库存方案二分布式事务7-7 rocketmq安装7-8 缓存库存接入异步化 本章…
暂无图片
编程学习 ·

文献管理之 Citavi & Latex

文章目录为什么选择Citavi安装地址使用指南不足之处官方文档 为什么选择Citavi 比较好的文献管理软件主要有Citavi、Endnote、Mendeley、Zotero,根据Citavi、Endnote、Mendeley 功能大比拼!到底哪一款才是众望所归的终极文献管理软件?总结,Citavi不仅是个免费的软件,而且功…
暂无图片
编程学习 ·

ps如何实现阳光照射效果

1.ps打开图片。2.按ctrl+j复制背景图层就会自动创建图层(图层 0 副本),选择图层 0 副本,按ctrl+alt+2调出高光选区,再按ctrl+j复制高光选区就会自动创建图层(图层 1)。3.选择图层1,ctrl+L打开色阶工具,拖动输入色阶的右边白色滑块向左边移动把图中亮的的地方调更亮。4…
暂无图片
编程学习 ·

车载TBOX标准-用于和后台系统/手机APP通信,实现手机APP车辆控制

基于新能源汽车控制数据智能终端T-BOX对于共享汽车(汽车分时租赁)场景中司机通过手机APP实现预订车辆、查找车辆、无线开门、启动车辆、还车等操作。 手机APP、云端平台与车辆实现信息互通。 T-Box作为车辆与云端平台实现互通的关键设备,不仅能把采集到的车辆数据(如新能源汽车…
暂无图片
编程学习 ·

Web服务器防护技术你了解多少?

技术的迅速发展,给人们提供便利的同时,也给人们带来了威胁。通常情况下,黑客、病毒会利用系统的漏洞来进行网络攻击,如篡改网页、蔓延病毒等,从而造成用户信息的窃取、重要数据的破坏。因此,要对web服务器的安全问题引起足够的重视,要加大安全防护力度、构建安全防护系统…
暂无图片
编程学习 ·

Promethus(普罗米修斯)监控系统搭建与使用实践

1.目标 1.1 能够安装prometheus服务器 1.2 能够通过安装node_exporter监控远程linux 1.3 能够通过安装mysqld_exporter监控远程mysql数据库 1.4 能够安装grafana 1.5 能够在grafana添加prometheus数据源 1.6 能够在grafana添加监控cpu负载的图形 1.7 能够在grafana图形显示mysq…
暂无图片
编程学习 ·

20北大软微华为实验班——排序题

学习目标:完成10017~10022 共6题(排序算法)中至少3道题。 1.基本排序题输入: 5 3 1 8 6 1 输出: 1 1 3 6 8思路一:冒泡排序(把最大的换到最后面) #include <iostream> using namespace std;int a[500000]={0};int main() {int n;cin>>n;//输入数据for(int …
暂无图片
编程学习 ·

自定义控件三部曲之动画篇(三)—— 代码生成alpha、scale、translate、rotate、set及插值器动画

一、概述前两篇,我为大家讲述了利用XML来定义动画及插值器,但在代码中,我们常常是动态生成动画的,所以,这篇将为大家讲述如何用代码生成动态生成动画及插值器。先简单写出各个标签对应的类,方便大家理解:scale —— ScaleAnimationalpha —— AlphaAnimationrotate ——…
暂无图片
编程学习 ·

Layui实现动态加载Tree

目录前言实现步骤初步准备构建data数据源 前言有空研究了一下Layui,感觉相对于EasyUI来说,美观了不少,结合后台加载动态Tree带大家初步了解一下这个框架实现步骤 初步准备 Layui官网 去官网下载好Layui,里面有示例和css、js等文件具体使用步骤: 要使用Layui,必须引入css文件…
暂无图片
编程学习 ·

快速排序进阶

三月不练手生。翻出了以前写的快速排序、单链表快排和scala快排。老老实实写把基础版写对就足够。 本文代码均经过测试。 1,快速排序的C++写法: #include <iostream> #include <vector> #include <algorithm>using namespace std;int getPartition(int arr…
暂无图片
编程学习 ·

pandas下-综合练习

综合练习端午节的淘宝粽子交易 端午节的淘宝粽子交易 (1) 请删除最后一列为缺失值的行,并求所有在杭州发货的商品单价均值。 df=pd.read_csv(F:\Datewheel资料\pandas组队学习\Pandas(下)综合练习数据集\端午粽子数据.csv) df.head()df.info()#查看列名 df.columns()注意列名…
暂无图片
编程学习 ·

Javaweb中的类:

filter //过滤器,解决中文字符集乱码util //数据库连接工具类entity //实体类dao //数据操作类servlet //servlet类
暂无图片
编程学习 ·

PMP-质量成本:一致性成本和非一致性成本对比

一致性成本vs非一致性成本,原文链接:https://www.ffeeii.com/1882.html质量成本:质量成本(cost of quality)包括在产品生命周期中为预防不符合要求,为评估产品或服务是否符合要求,以及因未达到要求(返工),而发生的所有成本。一致性成本:一致性成本(cost of conform…
暂无图片
编程学习 ·

MSAA那些事

高品质游戏中锯齿是一个讨厌的东西,形成锯齿的原因有很多种比如因为光栅化导致的锯齿,再比如因为Alpha test导致的锯齿,锯齿形成的原因多多少少都和smaple有关。有一种抗锯齿的方法叫做SSAA(超级采样抗锯齿),这个名字真的很吊,专制各种不服,专制各种锯齿。但是使用SSAA不…