golang 使用goto进行多错误处理
goto 语句介绍
在 Go 语言中,可以通过goto语句跳转到标签,进行代码间的无条件跳转。另外,goto语句在快速跳出循环、避免重复退出方面可以简化代码实现过程,但在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。
语法
goto label;
..
.
label: statement;
goto 语句流程图如下:

实例
在满足条件时,连续退出两层循环,传统编码方式如下:
func main() {
var isBreak bool
for x := 0; x < 20; x++ { // 外循环
for y := 0; y < 20; y++ { // 内循环
if y == 2 { // 当y等于2时
isBreak = true // 设置退出标记
break // 退出内层循环
}
}
if isBreak { // 根据标记退出外层循环
break
}
}
fmt.Println("over")
}
将上面的代码使用 goto 语句进行优化:
func main() {
for x := 0; x < 20; x++ {
for y := 0; y < 20; y++ {
if y == 2 {
goto breakTag // 跳转到标签
}
}
}
return
breakTag: // 标签
fmt.Println("123")
}
在以上代码中,使用 goto 语句 goto breakTag跳转到指定的自定义的标签 breakTag处,在定义 breakTag 标签之前有个 return 语句,此处如果不手动返回,则在不满足条件时也会执行 breakTag 代码。
多错误处理
在日常开发中,经常会遇到多错误处理问题,在多错误处理中往往存在代码重复的问题。例如:
func main() {
// 省略前面代码
err := getUserInfo()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
err = getEmail()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
fmt.Println("over")
}
在上面代码中,处理错误时,有一部分代码都是重复的。如果后期需要在这些代码中添加更多的判断条件,则需要在这些先相同的代码中重复修改,很容易造成疏忽和错误。这时可以通过 goto 语句来处理:
func main() {
// 省略前面代码
err := getUserInfo()
if err != nil {
goto doExit
}
err = getEmail()
if err != nil {
goto doExit
}
fmt.Println("over")
return
doExit: // 汇总所有流程,进行错误打印并退出进程
fmt.Println(err)
exitProcess()
}
以上代码在发生错误时,将统一跳转到自定义错误标签 doExit,汇总所有流程,进行错误打印并退出进程。
golang 使用goto进行多错误处理的更多相关文章
- golang 错误处理与异常
原文地址 golang 中的错误处理的哲学和 C 语言一样,函数通过返回错误类型(error)或者 bool 类型(不需要区分多种错误状态时)表明函数的执行结果,调用检查返回的错误类型值是否是 nil ...
- [golang note] 错误处理
错误处理 • 错误处理的标准模式 √ golang错误处理的标准模式:error接口. √ golang函数如果要返回错误,规范上是将error作为多返回值中的最后一个,但这并非是强制要求. ▶ er ...
- golang精选100题带答案
能力模型 级别 模型 初级 primary 熟悉基本语法,能够看懂代码的意图: 在他人指导下能够完成用户故事的开发,编写的代码符合CleanCode规范: 中级 intermediate 能够独立完成 ...
- 用goto做异常处理
http://www.cnblogs.com/trying/archive/2012/06/25/2863753.html 今天在CSDN上看到的关于错误返回值的讨论,感觉非常有趣. 从中可以看出被教 ...
- Excel VBA入门(8): 代码调试/错误处理/代码优化
VBE有丰富的调试工具, 比如立即窗口, 本地窗口, 监视窗口, 断点调试... 第一个博文中已经讲过调试的基本操作: 设置断点, F5运行, F8逐条运行 断点就是程序中暂停停止运行的位置, 设置断 ...
- excel 错误提示以及其他基础知识
http://wenda.tianya.cn/question/05a3d11b0e4f3c34 For i = 1 To ActiveSheet.ChartObjects.Count M ...
- 补充2:Golang 一些特性
Go语言的这些地方都做的还不错: 拥有自动垃圾回收: 不用手动释放内存 一个包系统: Go 语言的源码复用建立在包(package)基础之上.包通过 package, import, GOPATH 操 ...
- C错误异常处理,异常处理
预处理器标识#error的目的是什么啊? 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编 ...
- golang语言基础(一)
0.项目的组织结构: GOPATH路径下是src文件夹---->src文件夹下是项目名称---->项目名称下是该项目的各个包名---->各包名下是.go文件(一个包下,无论有多少个. ...
- [golang note] 包和导入
package的作用 √ package是golang最基本的分发单位和工程管理中依赖关系的体现. √ 每个golang源代码文件开头都拥有一个package声明,表示该g ...
随机推荐
- Qt编写物联网管理平台30-用户登录退出
一.前言 一个用户登录界面,是一个完整的应用系统,尤其是客户端系统必备的一个功能模块,传统的登录处理一般都是和本地的用户信息进行比对,而现代的登录系统一般是发送请求到服务器进行验证,无论何种方式,都是 ...
- Qt编写安防视频监控系统47-基本设置
一.前言 一个系统中肯定有不少的配置参数存储在配置文件中,配置文件可以是ini文件,也可以是json文件,还可以是自定义格式的文本文件,本人比较推荐ini文件,读写节点极其方便,支持中文内容,各种Qt ...
- Anaconda下载以前的旧版本
由于Anaconda新的版本,可能不太适合我们当前开发,我们需要下载历史版本. 可以尝试从两个地方下载:1.推荐从 "清华大学开源软件镜像站" 下载:https://mirrors ...
- IM跨平台技术学习(四):蘑菇街基于Electron开发IM客户端的技术实践
本文由蘑菇街前端技术团队分享,原题"Electron 从零到一",有修订和改动. 1.引言 本系列文章的前面几篇主要是从Electron技术本身进行了讨论(包括:第1篇初步了解El ...
- Github + Jekyll 搭建项目wiki
网站托管 创建新仓库 创建以自己名字为前缀, .github.io为后缀的仓库 在仓库的Settings中的Pages里设置Build and deployment为Github Actio ...
- Uniapp仿ChatGPT Stream流式输出(非Websocket)
前言 最近写一个chagpt小程序,流式输出可以使用websocket也可以使用stream来实现,这里就不折腾websocket的了,我发现uniapp实现流式输出的方式挺多的,主要是有些小程序还不 ...
- C# WebApi 全局配置模型验证和自定义错误处理。config Filters Add ModelStateValidationFilter/CustomExceptionFilter
public static void Start() { logger.Debug("Startup WebAPI..."); SwaggerConfig.Register(); ...
- Angular-教程
https://www.runoob.com/angularjs/angularjs-tutorial.html https://www.runoob.com/angularjs2/angularjs ...
- springboot-总结列表
一.Spring Boot 具有以下特点: 1. 独立运行的 Spring 项目 Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令" jav ...
- redux初探
action是一个普通对象 里面必须有一个type字段,代表将要执行的行为,其他字段自己规划. action只是描述了将要发生的事情并不能直接修改状态 action创建函数 尽量是一个纯函数,他返回的 ...