【go语言】error错误机制及自定义错误返回类型

2023-12-21

简介

Go 语言通过内置的 error 接口来处理错误,该接口定义如下:

type error interface {
    Error() string
}

这意味着任何实现了 Error() 方法的类型都可以作为错误类型。在 Go 中,通常使用 errors 包的 New 函数来创建简单的错误:

package main

import (
	"errors"
	"fmt"
)

func divide(a, b int) (int, error) {
	if b == 0 {
		return 0, errors.New("division by zero")
	}
	return a / b, nil
}

func main() {
	result, err := divide(10, 0)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Result:", result)
}

自定义错误类型

通过自定义两个错误变量,有利于判断错误类型

通常我们判断是否存在错误而不是判断不存在错误,有利于尽早失败避免嵌套

package main

import (
	"errors"
	"fmt"
)

var DivisionByZero = errors.New("除0错误")
var LessThanZero = errors.New("小于0错误")

func divide(a, b int) (int, error) {
	if b == 0 {
		return 0, DivisionByZero
	}
	if a < 0 {
		return 0, LessThanZero
	}
	return a / b, nil
}

func main() {
	result, err := divide(-1, 10)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Result:", result)
}

与其他语言不同点

  • 没有异常机制
  • error类型实现了error接口

源码分析看error类型:只需要实现Error方法就满足error接口的要求即为一个错误类

  • 可以通过errors.New()快速创建错误实例

errors包内的一部分,定义了New函数和一个errorString错误类型,用于快速创建和表示简单的错误。

  1. New 函数是一个工厂函数,用于创建一个新的错误。它接受一个字符串参数 text ,该字符串表示错误的文本描述。每次调用 New 都会返回一个新的错误对象,即使传递相同的文本描述,它们也是不同的错误对象。

  2. errorString 类型: errorString 是一个简单的实现了 error 接口的类型,它只有一个字符串字段 s 表示错误的文本描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【go语言】error错误机制及自定义错误返回类型 的相关文章

  • struct{} 和 struct{}{} 在 Go 中如何工作?

    我想知道 Go 中的 struct 和 struct 是什么意思 示例如下 array index struct or make map type struct struct is a keyword https golang org re
  • Go中的切片分配是否复制内存

    目的 我有一个大缓冲区 我想要一个指向缓冲区中不同位置的指针数组 切片 我在做什么 datPtrs make byte n for i 0 i
  • 从 C 调用带有字符串参数的 Go 函数?

    我可以从 C 调用一个没有参数的 Go 函数 按照下面的 https github com joeprivacy crefgo hello world 这通过编译go build和打印 Hello from Golang main func
  • Go1编译器如何工作?

    我在一个学校项目中接触 Go 大约一个月了 我注意到 src pkg go 文件夹中的 go ast go token go parser 等包 但是 gc 编译器基于位于 src cmd gc 中的 C 文件 我的问题是关于 Go1 中用
  • ConstantTimeByteEq 如何工作?

    在大神的密码库里 找到了这个函数ConstantTimeByteEq http golang org src pkg crypto subtle constant time go s 897 936 L17 它有什么作用 如何工作 Cons
  • 为什么 golang 堆配置文件中的“Total MB”小于顶部的“RES”?

    我有一个用 go 编写的服务 在运行时需要 6 7G 内存 RES 在顶部 所以我使用 pprof 工具试图找出问题所在 go tool pprof pdf http
  • 读取一个文本文件,替换其中的单词,输出到另一个文本文件

    所以我试图在 GO 中编写一个程序来获取一个充满代码的文本文件并将其转换为 GO 代码 然后将该文件保存到 GO 文件或文本文件中 我一直在试图弄清楚如何保存对文本文件所做的更改 但我可以看到更改的唯一方法是通过 println 语句 因为
  • 使用 Golang 通道处理 HTTP 请求

    我正在尝试构建一个简单的 Golang Appengine 应用程序 它使用通道来处理每个 http 请求 原因是我希望每个请求执行合理的大型内存计算 并且每个请求都以线程安全的方式执行 即来自并发请求的计算不会混合 这一点很重要 本质上
  • 带 cookie 身份验证的 Gorilla websocket

    这是我的设置 我正在构建一个带有用户登录的服务 使用 Negroni 和 Gorilla 登录后 用户会获得一个会话 cookie 服务器使用该会话 cookie 来授权受保护的端点 受保护的端点之一允许用户 客户端与服务器打开 Webso
  • 为什么结构体不能转换为嵌入类型

    package main type Inner struct x int type Outer struct Inner func main x Inner 1 y Outer x cannot convert x type Inner t
  • 在 Go 中修改导入的库

    我的问题 弹性节拍 https www elastic co products beats是一个用 Go 编写的日志传送程序的开源项目 它具有多种日志输出功能 包括控制台 Elasticsearch 和 Redis 我想将我自己的输出添加到
  • 在 Alpine 中找不到运行时/cgo

    In an alpine edge我安装的容器通过 RUN apk add no cache musl dev go 我试着跑go get github com golang protobuf protoc gen go then 这会导致
  • Go 中数组的嵌套结构

    我已经开始使用https mholt github io json to go https mholt github io json to go 将 API JSON 转换为 go 结构 我真的很喜欢它 但是我对如何初始化如下所示的报告定义
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 如何顺序运行 golang 测试?

    当我跑步时go test 我的输出 FAIL TestGETSearchSuccess 0 00s Location drivers api test go 283 Error Not equal 200 expected 204 actu
  • 无需时间即可生成随机字符串?

    我知道如何使用 Runes 和播种 rand Init 在 go 中生成随机字符串time UnixNano 我的问题是 是否可以 使用 stdlib 在不使用当前时间戳 安全 的情况下播种 rand 此外 我问 因为仅仅依靠时间来为敏感操
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • exec git 命令拒绝重定向到 Go 中的文件

    我试图从 go 调用 git log 并将输出重定向到给定文件 cmdArgs string log numstat reverse fmt Sprintf s HEAD 89c98f5ec48c8ac383ea9e27d792c3dc77
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c

随机推荐

  • Postman报错提示 Could not get any response怎么解决

    在通过 postman 请求做接口测试的过程中 有时候会遇到一些报错 当遇到这些报错我们不要着急 看着具体哪里报错 然后进行解决 postman报错 经常使用postman的小伙伴们都应该遇到过一些报错 遇到报错的时候我们不要着急 这么这几
  • Elasticsearch——索引数据

    索引可以说是Elasticsearch中非常重要的模块 一个索引可以视作关系数据库中的一张表 本帖将详细介绍与Elasticsearch索引相关的各种功能等 主要内容如下 索引映射 mapping 结构的定义方法 常用的各种字段类型和动态映
  • 【源码】基于SpringBoot+thymeleaf实现的快递之家管理系统

    系统介绍 基于SpringBoot thymeleaf实现的快递之家管理系统是为学校打造的高效的快递管理系统 系统分为管理员 注册用户两类角色 一共是分为三大菜单项 分别是我的物流 个人管理 后台管理 管理员拥有全部菜单 注册用户拥有我的物
  • Pytest自动化测试 - 必知必会的一些插件

    Pytest拥有丰富的插件架构 超过800个以上的外部插件和活跃的社区 在PyPI项目中以 pytest 为标识 本篇将列举github标星超过两百的一些插件进行实战演示 插件库地址 http plugincompat herokuapp
  • Selenium库编写爬虫详细案例

    一 引言 Selenium作为一个强大的自动化测试工具 其在网络爬虫领域也展现出了许多技术优势 首先 Selenium可以模拟浏览器行为 包括点击 填写表单 下拉等操作 使得它能够处理一些其他爬虫工具无法应对的情况 比如需要登录或者页面使用
  • 多任务学习综述

    文章目录 参考 概述 单任务独立学习 多任务学习 MTL 多任务的类型 联合学习 joint learning 对称 自主学习 learning to learn 非对称 非对
  • 《妙趣横生的算法》(C语言实现)- 第6章 数学趣题(二)

    6 1 连续整数固定和问题 找出任意输入的整数n的全部的连续整数固定和 题目分析 至少要找出两个连续整数的固定和 一个整数的话就是本身了呢 那如何确定这些连续整数呢 想明白了 第一个整数设为a 第二个整数是a 1 假设有m个连续整数 那么第
  • POE工业交换机:为工业网络供电的解决方案

    随着工业自动化和智能制造的发展 POE工业交换机 在现代工业网络中发挥着越来越重要的作用 本文将探讨POE工业交换机的工作原理 优势和应用 POE工业交换机的工作原理 POE工业交换机采用 以太网供电 Power over Ethernet
  • 工程结构振弦采集仪的新技术与新方法研究

    工程结构振弦采集仪的新技术与新方法研究 工程结构振弦采集仪的新技术与新方法研究旨在提高采集仪在工程结构振动监测中的性能和可靠性 以下是一些可能的研究方向 1 传感器技术改进 研究新型传感器技术 如光纤传感器 MEMS传感器等 以提高振弦采集
  • 设计与算法:迷宫问题

    描述 定义一个二维数组 int maze 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 它表示一个迷宫 其中的1表示墙壁 0表示可以走的路 只能横着走或竖着走 不能斜着走 要求编
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • 百年东芝“瞄准”汽车「芯」机遇

    在汽车 新四化 大变革的驱动下 汽车半导体市场进入需求暴涨的新周期 智能电动汽车所需要的半导体种类和数量正在急剧增加 东芝电子分立器件应用技术部经理成栋表示 东芝电子正在加大汽车半导体市场的布局 从而满足汽车电动化 智能化发展所带来的全新市
  • Java入门:java中单引号和双引号区别

    区别1 java中的 单引号 表示字符 java中的 双引号 是字符串 区别2 单引号 引的数据一般是char类型的 双引号 引的数据 是String类型的 区别3 java中 单引号 里面只能放一个字母或数字或符号 java中的 双引号
  • CloudPulse:一款针对AWS云环境的SSL证书搜索与分析引擎

    关于CloudPulse CloudPulse是一款针对AWS云环境的SSL证书搜索与分析引擎 广大研究人员可以使用该工具简化并增强针对SSL证书数据的检索和分析过程 在网络侦查阶段 我们往往需要收集与目标相关的信息 并为目标创建一个专用文
  • 【华为机试真题 Python】简单的自动曝光、平均像素值

    题目描述 一个图像有n个像素点 存储在一个长度为n的数组img里 每个像素点的取值范围 0 255 的正整数 请你给图像每个像素点值加上一个整数k 可以是负数 得到新图newImg 使得新图newImg的所有像素平均值最接近中位值128 请
  • 一文揭秘人才成长规律,看到就是赚到

    社会不教 精英不讲 看到就是赚到 为啥你比别人挣得少 职场当中 决定你能拿多少钱 并不在于你的学历 也并不在于你的背景 而在于你处于什么位置 你能做什么 你做了什么 你为谁做什么 能做什么 代表的是能力 你做了什么 代表的是方向和业绩 你为
  • 【项目管理】redmine

    Redmine是用Ruby开发的基于web的项目管理软件 是用ROR框架开发的一套跨平台项目管理系统 据说是源于Basecamp的ror版而来 支持多种数据库 有不少自己独特的功能 例如提供wiki 新闻台等 还可以集成其他版本管理系统和B
  • LeetCode:162. 寻找峰值、1901. 寻找峰值 II(二分 C++)

    目录 162 寻找峰值 题目描述 实现代码与解析 二分 原理思路 1901 寻找峰值 II 题目描述 实现代码与解析 二分 原理思路 162 寻找峰值 题目描述 峰值元素是指其值严格大于左右相邻值的元素 给你一个整数数组 nums 找到峰值
  • 计算机组成原理综合1

    1 完整的 计算机系统 应包括 D A 运算器 存储器和控制器 B 外部设备和主机 C 主机和实用程序 D 配套的硬件设备和软件系统 2 计算机系统中的存储器系统是指 D A RAM存储器 B ROM存储器 C 主存储器 D 主存储器和外存
  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors