当前位置: 首页 > news >正文

Golang学习笔记_23——error补充

Golang学习笔记_20——error
Golang学习笔记_21——Reader
Golang学习笔记_22——Reader示例


文章目录

    • error补充
      • 1. 基本错误处理
      • 2. 自定义错误
      • 3. 错误类型判断
        • 3.1 类型断言
        • 3.2 类型选择
      • 4. panic && recover
    • 源码


error补充

1. 基本错误处理

在Go中,函数通常返回两个值:一个是预期的结果,另一个是error类型的值。
如果函数执行过程中发生错误,error值将不为nil

func divide(a, b float64) (float64, error) {if b == 0 {return 0, errors.New("division by zero")}return a / b, nil
}func error_demo_1() {// 调用 divide 函数进行除法运算result, err := divide(10, 0)if err != nil {// 处理错误println("Error:", err)} else {// 输出结果println("Result:", result)}
}

测试方法

func Test_error_demo_1(t *testing.T) {error_demo_1()
}

输出结果

=== RUN   Test_error_demo_1
Error: (0x105134bc8,0x1400009ef48)
--- PASS: Test_error_demo_1 (0.00s)
PASS

2. 自定义错误

自定义错误类型可以实现error接口,该接口仅包含一个Error方法,返回一个字符串。

// 自定义错误
type MyError2 struct {When stringwhat string
}func (e *MyError2) Error() string {return fmt.Sprintf("when: %s, what: %s", e.When, e.what)
}func testMyError() error {err := &MyError2{When: "now",what: "something wrong",}return err
}

测试方法

func Test_testMyError(t *testing.T) {if err := testMyError(); err != nil {fmt.Println(err)}
}

输出结果

=== RUN   Test_testMyError
when: now, what: something wrong
--- PASS: Test_testMyError (0.00s)
PASS

3. 错误类型判断

3.1 类型断言
// MyError2 是自定义错误类型func ErrorAssertDemo() error {err := &MyError2{When: "now",what: "something wrong",}return err
}func TestErrorAssertDemo() {err := ErrorAssertDemo()if specificErr := err.(*MyError2); specificErr != nil {fmt.Println("specificErr:", specificErr)} else {fmt.Println("normalErr:", err)}
}

测试方法

func Test_ErrorAssertDemo(t *testing.T) {TestErrorAssertDemo()
}

输出结果

=== RUN   Test_ErrorAssertDemo
specificErr: when: now, what: something wrong
--- PASS: Test_ErrorAssertDemo (0.00s)
PASS
3.2 类型选择
// 错误类型选择
// MyError2 是自定义错误类型
func ErrorTypeDemo1() error {return &MyError2{When: "now",what: "myError wrong",}
}func ErrorTypeDemo2() error {return errors.New("normal wrong")
}func switchErrorDemo(err error) {if err != nil {switch err1 := err.(type) {case *MyError2:fmt.Println("myError2:", err1)default:fmt.Println("normal:", err1)}}
}func TestErrorTypeDemo() {err1 := ErrorTypeDemo1()err2 := ErrorTypeDemo2()switchErrorDemo(err1)switchErrorDemo(err2)
}

测试方法

func Test_ErrorTypeDemo(t *testing.T) {TestErrorTypeDemo()
}

输出结果

=== RUN   Test_ErrorTypeDemo
myError2: when: now, what: myError wrong
normal: normal wrong
--- PASS: Test_ErrorTypeDemo (0.00s)
PASS

4. panic && recover

在Go中,panic用于表示一个不可恢复的运行时错误。当panic发生时,程序将停止正常执行,并开始逐级调用已注册的延迟函数(deferred functions),随后程序崩溃。
recover是一个内置函数,用于从panic中恢复。它只能在延迟函数中调用。在正常的执行路径中调用recover将返回nil

// panic 和 recover
func myPanic() {panic("error happened")
}func safeRecover() {defer func() {if err := recover(); err != nil {fmt.Println("recover:", err)}}()myPanic()
}

测试方法

func Test_safeRecover(t *testing.T) {safeRecover()fmt.Println("after recover")}

输出结果

=== RUN   Test_safeRecover
recover: error happened
after recover
--- PASS: Test_safeRecover (0.00s)
PASS

源码

// error_demo_2.go 文件
package error_demoimport ("errors""fmt"
)func divide(a, b float64) (float64, error) {if b == 0 {return 0, errors.New("division by zero")}return a / b, nil
}func errorDemo1() {// 调用 divide 函数进行除法运算result, err := divide(10, 0)if err != nil {// 处理错误println("Error:", err)} else {// 输出结果println("Result:", result)}
}// 自定义错误
type MyError2 struct {When stringwhat string
}func (e *MyError2) Error() string {return fmt.Sprintf("when: %s, what: %s", e.When, e.what)
}func testMyError() error {err := &MyError2{When: "now",what: "something wrong",}return err
}func ErrorAssertDemo() error {err := &MyError2{When: "now",what: "something wrong",}return err
}func TestErrorAssertDemo() {err := ErrorAssertDemo()if specificErr := err.(*MyError2); specificErr != nil {fmt.Println("specificErr:", specificErr)} else {fmt.Println("normalErr:", err)}
}// 类型选择
func ErrorTypeDemo1() error {return &MyError2{When: "now",what: "myError wrong",}
}func ErrorTypeDemo2() error {return errors.New("normal wrong")
}func switchErrorDemo(err error) {if err != nil {switch err1 := err.(type) {case *MyError2:fmt.Println("myError2:", err1)default:fmt.Println("normal:", err1)}}
}func TestErrorTypeDemo() {err1 := ErrorTypeDemo1()err2 := ErrorTypeDemo2()switchErrorDemo(err1)switchErrorDemo(err2)
}// panic 和 recoverfunc myPanic() {panic("error happened")
}func safeRecover() {defer func() {if err := recover(); err != nil {fmt.Println("recover:", err)}}()myPanic()
}
// error_demo_2_test.go 文件
package error_demoimport ("fmt""testing"
)func Test_error_demo_1(t *testing.T) {errorDemo1()
}func Test_testMyError(t *testing.T) {if err := testMyError(); err != nil {fmt.Println(err)}
}func Test_ErrorAssertDemo(t *testing.T) {TestErrorAssertDemo()
}func Test_ErrorTypeDemo(t *testing.T) {TestErrorTypeDemo()
}func Test_safeRecover(t *testing.T) {safeRecover()fmt.Println("after recover")}

相关文章:

Golang学习笔记_23——error补充

Golang学习笔记_20——error Golang学习笔记_21——Reader Golang学习笔记_22——Reader示例 文章目录 error补充1. 基本错误处理2. 自定义错误3. 错误类型判断3.1 类型断言3.2 类型选择 4. panic && recover 源码 error补充 1. 基本错误处理 在Go中,函数…...

邯郸地标美食导游平台的设计与实现

标题:邯郸地标美食导游平台的设计与实现 内容:1.摘要 摘要:本文介绍了邯郸地标美食导游平台的设计与实现。该平台旨在为游客提供邯郸地标美食的详细信息和导航服务,帮助游客更好地了解和品尝邯郸的特色美食。文章首先介绍了项目的背景和目的&#xff0c…...

滑动窗口限流算法:基于Redis有序集合的实现与优化

滑动窗口限流算法是一种基于时间窗口的流量控制策略,它将时间划分为固定大小的窗口,并在每个窗口内记录请求次数。通过动态滑动窗口,算法能够灵活调整限流速率,以应对流量的波动。 算法核心步骤 统计窗口内的请求数量&#xff1…...

Angular 最新版本和 Vue 对比完整指南

1. Angular 最新版本 当前 Angular 最新稳定版本是 Angular 17(2024年初) 2. 主要区别对比表 特性 | Angular | Vue 框架类型 | 完整框架 | 渐进式框架 默认语言 | TypeScript | JavaScript/TypeScript 数据处理 | RxJS | Promise/async/await 架构特点 | 依赖注入,…...

DAY39|动态规划Part07|LeetCode:198.打家劫舍、213.打家劫舍II、337.打家劫舍III

目录 LeetCode:198.打家劫舍 基本思路 C代码 LeetCode:213.打家劫舍II 基本思路 C代码 LeetCode:337.打家劫舍III 基本思路 C代码 LeetCode:198.打家劫舍 力扣题目链接 文字讲解:LeetCode:198.打家劫舍 视频讲解:动态规划,偷不偷这个…...

MYSQL----------------sql 优化

优化 SQL 语句的一般步骤 1. 了解 SQL 的执行频率 SHOW STATUS LIKE Com_%;代码解释: SHOW STATUS LIKE Com_%;:此命令可以查看各种 SQL 语句的执行频率,例如 Com_select 表示 SELECT 语句的执行次数,Com_insert 表示 INSERT 语…...

深度学习中的正则化方法

最近看到了正则化的内容,发现自己对正则化的理解已经忘得差不多了,这里在整理一下,方便以后查阅。 深度学习中的正则化方法 1. L2 正则化(L2 Regularization)2. L1 正则化(L1 Regularization)3.…...

前端报告 2024:全新数据,深度解析未来趋势

温馨提示: 此报告为国际版全球报告,其中所涉及的技术应用、工具偏好、开发者习惯等情况反映的是全球前端开发领域的综合态势。由于国内外技术发展环境、行业生态以及企业需求等存在差异,可能有些内容并不完全契合国内的实际情况,请大家理性阅读,批判性地吸收其中的观点与信…...

计算机网络之---子网划分与IP地址

子网划分与IP地址的关系 在计算机网络中,子网划分(Subnetworking)是将一个网络划分为多个子网络的过程。通过子网划分,可以有效地管理和利用IP地址空间,提高网络的性能、安全性和管理效率。 子网划分的基本目的是通过…...

计算机网络 (31)运输层协议概念

一、概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。运输层的一个核心功能是提供从源端主机到目的端主机的可靠的、与实际使用的网络无关的信息传输。它向高层用…...

代码随想录算法训练营day28

代码随想录算法训练营 —day28 文章目录 代码随想录算法训练营前言一、122.买卖股票的最佳时机II二、55. 跳跃游戏三、跳跃游戏 II方法一方法二 1005. K 次取反后最大化的数组和总结 前言 今天是算法营的第28天,希望自己能够坚持下来! 今日任务&#x…...

建立时间和保持时间

建立时间 在时钟有效沿到来之前,数据必须维持一段时间保持不变,这段时间就是建立时间 Tsetup 1 基本概念 建立时间(Setup Time): 在 SystemVerilog 中,建立时间是指在时钟信号的有效边沿(例如…...

vue,router路由传值问题,引用官方推荐

参考贴https://blog.csdn.net/m0_57033755/article/details/129927829 根据官方文档的更新日志,建议使用state传值 官方文档更新日志 实际的console结果 传值 router.push({ name: KnowledgeDetail, state: { params } });接收值 const historyParams histor…...

AIDD-人工智能药物设计-AlphaFold系列:年终回顾,AlphaFold迄今为止的实际应用案例

AlphaFold系列:年终回顾,AlphaFold迄今为止的实际应用案例 01 引言 AlphaFold由 DeepMind 团队开发,最初在蛋白质结构预测竞赛 CASP 中惊艳亮相。随着 AlphaFold2 和后续版本的迭代进步,其精度和通用性不断提升,逐渐走…...

Scala语言的面向对象编程

Scala语言的面向对象编程 引言 在当今的软件开发中,面向对象编程(OOP)是一种非常强大且广泛使用的编程范式。Scala是一种现代编程语言,结合了面向对象编程和函数式编程的特性,非常适合用于大规模软件的开发。本文将介…...

MySQL学习记录1【DQL和DCL】

SQL学习记录 该笔记从DQL处开始记录 DQL之前值得注意的点 字段 BETWEEN min AND max 可以查询区间[min, max]的数值如果同一个字段需要满足多个OR条件,可以采取 字段 IN(数值1, 数值2, 数值3....)LIKE语句 字段 LIKE ___%%% 表示模糊匹配,_匹配一个字段…...

验证码转发漏洞

开发人员有时候会以数组的形式接收用户的手机号并遍历执行,这时就可以在注册或登录页面填写两个手机号并点击发送验证码,这两个手机号会同时收到相同验证码,可以用任意一个手机号登录或注册,即验证码转发漏洞。 1、burpsuite内置…...

使用 C++ 实现神经网络:从基础到高级优化

引言 在现代机器学习中,神经网络已经成为最重要的工具之一。虽然 Python 提供了诸如 TensorFlow、PyTorch 等强大的机器学习库,但如果你想深入理解神经网络的实现原理,或者出于某些性能、资源限制的考虑,使用 C 来实现神经网络会是…...

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

目录 ./real.exe错误1:ERROR while reading namelist physics./wrf.exe错误1:FATAL CALLED FROM FILE: <stdin> LINE: 2419 Warning: too many input landuse types参考./real.exe 错误1:ERROR while reading namelist physics 执行./real.exe时,报错如下: taski…...

Kotlin语言的循环实现

Kotlin语言中的循环实现 Kotlin是一种现代的、跨平台的编程语言&#xff0c;广泛应用于Android开发、后端服务及多种其他软件开发领域。与Java类似&#xff0c;Kotlin也支持多种循环结构&#xff0c;包括for循环、while循环和do while循环。掌握这些循环结构是每个Kotlin开发者…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...