在 Go 语言中,error 是一个内置的接口类型,用于表示错误情况。error 接口的定义如下:

type error interface {
Error() string
}

任何具有 Error() string 方法的类型都可以被视为实现了 error 接口。

创建自定义错误

尽管 Go 提供了 errors.New 函数用于创建简单的错误信息,但有时候,我们可能需要创建更复杂的自定义错误。这可以通过定义一个实现了 Error 方法的结构体来实现:

type MyError struct {
Msg string
File string
Line int
} func (e *MyError) Error() string {
return fmt.Sprintf("%s:%d: %s", e.File, e.Line, e.Msg)
}

在这个例子中,MyError 包含了一个错误消息、文件名和行号。Error 方法返回一个格式化的错误字符串。

创建 MyError 的实例:

err := &MyError{
Msg: "something went wrong",
File: "main.go",
Line: 42,
}
fmt.Println(err) // 输出 "main.go:42: something went wrong"

错误的包装和解包

在处理错误时,我们有时候会遇到需要将一个错误包装到另一个错误中的情况,这可以通过 fmt.Errorf 函数和 %w 动词实现:

func Foo() error {
return errors.New("foo failed")
} func Bar() error {
err := Foo()
if err != nil {
return fmt.Errorf("bar failed: %w", err)
}
return nil
} err := Bar()
if err != nil {
fmt.Println(err) // 输出 "bar failed: foo failed"
}

在这个例子中,Bar 函数调用了 Foo 函数,如果 Foo 函数返回了一个错误,Bar 函数会将这个错误包装到它自己的错误中。

你可以使用 errors.As 函数检查错误是否为特定的类型,或者使用 errors.Unwrap 函数获取被包装的错误。

理解并正确使用 error 接口是编写 Go 程序的关键,因为大多数函数和方法都会返回一个 error 类型的值来表示可能的错误情况。

推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

【go语言】2.3.2 error 接口的更多相关文章

  1. go语言之进阶篇error接口应用

    1.error接口应用 示例: package main import "fmt" import "errors" func MyDiv(a, b int) ( ...

  2. go语言之进阶篇error接口的使用

    1.error接口的使用 示例: package main import "fmt" import "errors" func main() { //var e ...

  3. Go 语言中的方法,接口和嵌入类型

    https://studygolang.com/articles/1113 概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 编译器会 ...

  4. 生成跨语言的类型声明和接口绑定的工具(Djinni )

    Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...

  5. [Go] golang的error接口

    error接口1.error就是一个接口interface2.属于errors包,该包有一个导出方法New,返回了errorString类型3.errorString类型实现了error接口4.之所以 ...

  6. Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】

    原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...

  7. Go语言系列(六)- 接口和反射

    接口 1. 定义: Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. type example interface{ Method1(参数列表) 返 ...

  8. 【原创】go语言学习(十七)接口应用实战--日志库

    目前 日志库需求分析 日志库接口设计 文件日志库开发 Console日志开发 日志使用以及测试 日志库需求分析 1.日志库需求分析 A. 程序运行是个黑盒B. 而日志是程序运行的外在表现C. 通过日志 ...

  9. Go语言练习之方法,接口,并发

    多练练,有感觉了就写实际的东东. package main import ( "fmt" "math" "os" "time&qu ...

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 接口(抽象类)

    接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至少有一个函数被声明为纯虚 ...

随机推荐

  1. Python 列表定义

    列表定义 由一系列按特定排序排列的元素组成,各元素之间无任何关系 用方括号[]来表示列表,并用逗号分隔其中的元素 访问列表元素 列表是有序集合,访问列表元素时,只需将该元素的位置或索引告知python ...

  2. C++ | 类继承

    1. 概述 C++有3种继承方式:公有继承(public).保护继承(protected).私有继承(private). 一个B类继承于A类,或称从类A派生类B.这样的话,类A称为基类(父类),类B称 ...

  3. SQLlabs less1-10通关笔记

    SQLlabs 通关笔记 mysql数据结构 在练习靶场前我们需要了解以下mysql数据库结构,mysql数据库5.0以上版本有一个自带的数据库叫做information_schema,该数据库下面有 ...

  4. 文心一言 VS chatgpt (10)-- 算法导论 3.1 2~3题

    二.证明:对任意实常量a和b,其中b>0,有(n+a) ^ b=O(n ^ b). 文心一言: 设a=b,则有(n+a) ^ b=(n+b)(n+a)=n ^ b+n ^ b =O(n ^ b) ...

  5. 2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x ...

  6. 2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构。

    2021-04-08:给定一个单链表的头节点head,请判断该链表是否为回文结构. 福大大 答案2021-04-08: 1.找中点. 2.按中点切分成两个链表. 3.反转右边链表. 4.相等判断. 5 ...

  7. Django4全栈进阶之路12 render 函数和 redirect 函数

    在 Django 中,你可以使用 render 函数来渲染模板并将其返回给客户端,也可以使用 redirect 函数来重定向到其他 URL. 在 Django 中,render 函数和 redirec ...

  8. vue全家桶进阶之路37:Vue3 路由守卫

    在 Vue.js 3.x 中,我们可以使用路由守卫来拦截路由的跳转,从而实现一些功能,例如:登录验证.页面权限控制等. Vue.js 3.x 中的路由守卫和 Vue.js 2.x 中的基本相同,都包含 ...

  9. Qt数据可视化项目

    一.创建项目(步骤按常规来即可) 二.ui设计界面 控件的使用 默认视角:Label标签和horizontalSlider标签 水平旋转:Label标签和horizontalSlider标签 垂直旋转 ...

  10. k8s calico网络