Go错误处理方式真的不好吗?

news2025/1/20 16:26:47

在这里插入图片描述
平时经常上一些网络平台阅读一些技术讨论的话题,对Go语言方面也有些浅浅的关注,正如标题所问,Go语言错误处理可以说算是网络上开发中对Go语言吐槽最多的点之一,那么,Go错误处理真的很不堪吗?

对此我认为:并不是

相反,我觉得Go的错误处理对程序设计来讲十分优雅。

错误处理对程序的重要性

在软件开发中,错误处理可以帮助我们识别和解决程序中的问题,提高程序的可靠性和稳定性。具体而言,错误处理具有以下优点:

  • 提高程序的健壮性:通过捕获和处理异常和错误,程序可以更加健壮,能够处理各种可能出现的错误情况。

  • 提供更好的用户体验:通过及时的错误提示和处理,可以提高用户体验,使用户更加愉快地使用程序。

Go语言错误与异常

首先我们要明辨程序中的错误和异常,程序中的错误和异常是指在程序运行过程中发生的意外情况,导致程序无法正常执行或产生不正确的结果。

在Go语言中,错误是指在函数或方法执行过程中出现的问题,通常是可预见和可避免的。当函数遇到错误时,Go语言的惯例是返回一个错误值,这是一种明确的错误传递方式。开发者可以通过检查返回的错误值来判断函数执行的结果,并采取相应的处理措施。

异常则是指一些不可预见的错误和程序异常行为,例如除以零或空指针引用等。Go语言并没有像其他语言那样提供内置的异常机制,而是更倾向于鼓励开发者显式地检查错误并处理。因此,在Go语言中,异常通常是以错误的形式表示的,开发者需要自行判断是否需要将错误升级为异常,并采取相应的处理逻辑。

下面的例子,是Go语言发生panic异常的例子:

package main

import "fmt"

func main() {
   type Student struct {
      Name string
   }

   var stu *Student

   fmt.Println(stu.Name)
}

异常信息:

在这里插入图片描述
处理异常:

package main

import "fmt"

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("程序发生异常,异常信息:", err)
		}
	}()

	type Student struct {
		Name string
	}

	var stu *Student

	fmt.Println(stu.Name)
}

处理结果:

在这里插入图片描述
下面这个例子是Go语言处理错误:

package main

import (
   "errors"
   "fmt"
)

type Student struct {
   Name string
}

func main() {
   var stu *Student
   if err := printName(stu); err != nil {
      fmt.Println(err)
   }
}

func printName(stu *Student) error {
   if stu == nil {
      return errors.New("param is nil")
   }
   fmt.Println(stu.Name)
   return nil
}
Go 错误处理的优势

Go 语言采用了一种简洁而直接的错误处理机制。在 Go 中,错误是一种内置类型,可以使用 error 类型来定义。而异常(panic)也可以通过 recover() 函数转换为 error来处理。

这种错误处理机制的优点在于:

  • 简单易用:Go 语言的错误处理机制简单直观,易于使用。开发者只需检查函数返回的错误值即可。

  • 可读性强:由于错误处理与程序主体分离,使得代码更加清晰,易于阅读和维护。

接下来我们深入分析下:

Go为什么不采用相对复杂的类似于try…catch…的方式来处理错误?

我认为这种处理错误的方式有悖于Go语言的核心设计哲学:less is more

此外,Go设计者可能希望开发人员明确知道自己在做什么,因而采用显式的基于值比较的错误处理方案,函数和方法中的错误都会通过 return 语句显式地返回,这使得调用者不能忽略对返回的错误的处理。如果依赖try…catch…的全局捕获,而不会深入挖掘实际的具体错误类型和返回值。这就导致了代码有实际的异常们并没有正确处理它。

综上所述,Go语言的错误处理机制具有强制性、明确性、多样性和传播性等优点,有助于提高代码的健壮性和可靠性,减少错误被忽略的可能性,并帮助我们更快速地定位和解决问题。

小结

通过上面的分析,我们可以看到 Go 语言的错误处理机制非常强大且实用。虽然一些开发者可能认为 Go 语言的错误处理不够直观或难以理解,但是这种机制为程序带来了更高的健壮性和可维护性。在实践中,开发者需要仔细地处理每个函数返回的错误,以便及时发现和解决问题。

欢迎大家关注我,回复【Go】即可获取Go相关资料推荐
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095444.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)1

CANoe制作网关实现CAN报文故障注入(报文长度/timeout/信号错误/E2E) 文章目录 CANoe制作网关实现CAN报文故障注入(报文长度/timeout/信号错误/E2E)1.基本介绍和实现功能 1.基本介绍和实现功能 下面是一个完整的CAN/CANFD总线&…

【Wifi】Wifi架构介绍

Wifi架构介绍 本文基于Android介绍其Wifi架构。Wifi是许多操作系统提供的重要功能之一,特别是越来越多的车载系统wifi是其必备功能。为啥wifi是必备功能? 一方面是传统的上网(现在有些车载使用DCM模块管理网络),另一方…

项目管理软件中注释功能的作用是什么?

在项目管理软件中,注释功能允许您对任务、文件夹和项目进行详细的标注。这一功能不仅便于团队成员之间的沟通与协作,还能提高项目管理的效率。通过在项目中添加评论,您可以及时了解项目的最新动态,提出疑问并寻求解决方案。此外&a…

【大模型应用开发教程】01_大模型简介

C1 大模型简介 一. 什么是LLM(大语言模型)?1. 发展历程2. 大语言模型的概念LLM的应用和影响 二、大模型的能力和特点1. 大模型的能力1.1 涌现能力(emergent abilities)1.2 作为基座模型支持多元应用的能力1.3 支持对话…

AN基础工具——填色工具

【AN基础工具——填色工具】 基本使用方法填色补充给色块周围画上线 变色动画渐变变色的蜥蜴 本篇内容:填色动画制作 重点内容:填色工具 工 具:Adobe Animate 2022 基本使用方法 填色补充 之前说图形要封闭才能填色,实际情况是有…

ESP8266 Node Mcu开发板连接WIFI并上报数据到MQTT服务器——物联网应用开发

一、前言 本文主要介绍关于ESP8266 Node Mcu开发板如何连接WIFI并将本地采集的数据上传到MQTT服务器中。 大家调试可以使用MQTTBox 二、WIFI连接 首先&#xff0c;导入WIFI连接所需的头文件&#xff0c;引入所需库。 #include <ESP8266WiFi.h> 声明字符串常量&#xff0…

3.1 模板测试与深度测试(Stencil Test Z Test)

一、模板测试&#xff08;Stencil Test&#xff09; 模板测试可以实现的一些效果图 1.是什么 ①从渲染管线出发&#xff1a;模板测试是在逐片源操作阶段&#xff0c;透明测试之后&#xff0c;深度测试之前的位置。 ②从书面概念上理解 说到模板测试&#xff0c;就要先说道模…

Java设计模式-结构性设计模式(享元设计模式)

简介 属于结构型模式&#xff0c;主要⽤于减少创建对象的数量&#xff0c;以减少内存占⽤和提⾼性能&#xff0c; 它提供了减少对象数量从⽽改善应⽤所需的对象结构的⽅式享元模式尝试重⽤现有的同类对象&#xff0c;如果未找到匹配的对象&#xff0c;则创建新对象应用场景 JAV…

C语言天花板——指针(进阶1)

接上次的指针初阶&#xff08;http://t.csdnimg.cn/oox5s&#xff09;&#xff0c;这次我们继续的探寻指针的奥秘&#xff0c;发车咯&#xff01;&#xff01;&#xff01;&#x1f697;&#x1f697;&#x1f697; 一、字符指针 可以看到我们将指针p给打印出来&#xff0c;就是…

LDA(Fisher)线性判别分析

LDA&#xff08;Fisher&#xff09;线性判别分析 对于二分类问题若存在一个 y i W x i y_iWx_i yi​Wxi​将样本 X \pmb X X投影到一维空间上 为了使两个样本能够较好的分开&#xff0c;应该是的每一个同类的样本的方差&#xff08;离散程度&#xff09;尽可能的小&#xff0…

Java实现hack汇编器

Hack汇编语言是一种特定于计算机体系结构的汇编语言&#xff0c;使用Hack架构的机器码指令来编写程序。Hack是一种基于Von Neumann结构的计算机体系结构&#xff0c;由Harvard大学的Nand to Tetris项目开发出来&#xff0c;用于实现计算机硬件和软件。 Hack汇编语言主要用于在…

FPGA面试题(5)

一.FPGA可以综合实现为RAM/ROM/CAM的三种资源及注意事项 三种资源&#xff1a;BLOCK RAM&#xff0c;触发器&#xff08;FF&#xff09;&#xff0c;查找表&#xff08;LUT&#xff09; 注意事项&#xff1a; 1.生成RAM&#xff0c;首选BLOCK RAM。因为BLOCK RAM是已经存在的“…

Jmeter压测http接口和java代码放在Jmeter执行

Jmeter无缝支持java语言&#xff0c;使其在市场上有很高的占有率&#xff0c;一些公司还专门对JMenter进行二次开发&#xff0c;使其成为公司级压测平台。 本次介绍JMenter的一些入门级使用&#xff0c;方便大家继续深入探索。 1、启动Jmeter 2、压测简单http接口 添加线程组…

Ant Design Vue设置表格滚动 宽度自适应 不换行

Ant Design Vue设置表格滚动 宽度自适应 不换行 添加以下属性即可解决这个问题&#xff1a; <a-table :columns"columns" :data-source"list":pagination"false"bordered:scroll"{ x: max-content }" >

Lazysysadmin靶机

信息收集 主机发现 nmap -sn 192.168.88.0/24 //-sn&#xff1a;制作主机发现&#xff0c;不做端口扫描&#xff1b;扫描结果包含本机IP 端口扫描 nmap --min-rate 10000 -p- 192.168.88.136 扫描端口详细信息 端口扫描发现&#xff0c;该主机的22、80、139、445、3306、…

进阶JAVA篇- DateTimeFormatter 类与 Period 类、Duration类的常用API(八)

目录 1.0 DateTimeFormatter 类的说明 1.1 如何创建格式化器的对象呢&#xff1f; 1.2 DateTimeFormatter 类中的 format&#xff08;LocalDateTime ldt&#xff09; 实例方法 2.0 Period 类的说明 2.1 Period 类中的 between(localDate1,localDate2) 静态方法来创建对象。 3.…

vue过渡动画效果

官网:https://cn.vuejs.org/v2/api/#transition 要与v-show,v-if 动态组件结合 给需要过渡的元素外层加<transition> ,并用name命名 , show:true, --------------------- <button click"show!show">button</button> <transition namefade>&…

基本地址变换机构

基本地址变换机构&#xff1a;用于实现逻辑地址到物理地址转换的一组硬件机构。 关于页号页表的定义&#xff0c;放个本人的传送门 1.页表寄存器 基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。 1.作用 通常会在系统中设置一个页表寄存器&#xff08;PTR&…

KubeVela交付

有什么用我也不想说了&#xff0c;这个是k8s CI/CD,进阶玩家玩的了&#xff0c;比你们喜欢Arg CD更科学&#xff0c;更现代 在 Kubernetes 中安装 KubeVela helm repo add kubevela https://charts.kubevela.net/core helm repo update helm install --create-namespace -n v…

云耀云服务器L实例部署k8s测评|华为云云耀云服务器L实例评测使用体验

文章目录 云耀云服务器L实例部署k8s测评名词解释云耀云服务器L实例云耀负载均衡k8s及使用场景1.3.1 微服务架构1.3.2 自动化部署1.3.3 弹性伸缩1.3.4 多租户环境1.3.5 持续集成和持续部署 3. 部署华为云云耀服务器L实例3.1 云耀服务器L实例购买3.1.1 云耀服务器L实例初始化配置…