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

Go的error接口

从本书的开始,我们就已经创建和使用过神秘的预定义error类型,而且没有解释它究竟是什么。实际上它就是interface类型,这个类型有一个返回错误信息的单一方法:

type error interface { Error() string }

创建一个error最简单的方法就是调用errors.New函数,它会根据传入的错误信息返回一个新的error。整个errors包仅只有4行:

package errors func New(text string) error { return &errorString{text} } type errorString struct { text string } func (e *errorString) Error() string { return e.text }

承载errorString的类型是一个结构体而非一个字符串,这是为了保护它表示的错误避免粗心(或有意)的更新。并且因为是指针类型*errorString满足error接口而非errorString类型,所以每个New函数的调用都分配了一个独特的和其他错误不相同的实例。我们也不想要重要的error例如io.EOF和一个刚好有相同错误消息的error比较后相等。

fmt.Println(errors.New("EOF") == errors.New("EOF")) // "false"

调用errors.New函数是非常稀少的,因为有一个方便的封装函数fmt.Errorf,它还会处理字符串格式化。我们曾多次在第5章中用到它。

package fmt import "errors" func Errorf(format string, args ...interface{}) error { return errors.New(Sprintf(format, args...)) }

虽然*errorString可能是最简单的错误类型,但远非只有它一个。例如,syscall包提供了Go语言底层系统调用API。在多个平台上,它定义一个实现error接口的数字类型Errno,并且在Unix平台上,Errno的Error方法会从一个字符串表中查找错误消息,如下面展示的这样:

package syscall type Errno uintptr // operating system error code var errors = [...]string{ 1: "operation not permitted", // EPERM 2: "no such file or directory", // ENOENT 3: "no such process", // ESRCH // ... } func (e Errno) Error() string { if 0 <= int(e) && int(e) < len(errors) { return errors[e] } return fmt.Sprintf("errno %d", e) }

下面的语句创建了一个持有Errno值为2的接口值,表示POSIX ENOENT状况:

var err error = syscall.Errno(2) fmt.Println(err.Error()) // "no such file or directory" fmt.Println(err) // "no such file or directory"

err的值图形化的呈现在图7.6中。

Errno是一个系统调用错误的高效表示方式,它通过一个有限的集合进行描述,并且它满足标准的错误接口。我们会在第7.11节了解到其它满足这个接口的类型。

http://www.lryc.cn/news/175004.html

相关文章:

  • RabbitMQ 集群 - 普通集群、镜像集群、仲裁队列
  • 高项新版教程(第四版)解读+学习指导
  • 【Debian】Debian10.0.0安装选项问答
  • 【基于React-Native做位置信息获取,并展示出来】
  • ansible安装、点对点Ad-Hoc、模块、剧本Playbook
  • Ceph入门到精通-ceph pool 删除导致 misplaced 的原因
  • 计算机组成原理课程设计
  • 《从菜鸟到大师之路 MySQL 篇》
  • 使用qt完善对话框功能
  • Day 03 python学习笔记
  • 优化类问题概述
  • 第一个 Go 程序“hello,world“ 与 main 函数
  • MySQL缓冲池Buffer Pool
  • springboot实现发送邮箱验证码
  • ESP8266使用记录(三)
  • 基于微信小程序的在线视频课程学习平台设计与实现(源码+lw+部署文档+讲解等)
  • CloudCompare 二次开发(15)——点云添加高斯噪声
  • 一波免费、好用的API接口分享
  • Android App ~ LiveData
  • 全球第4大操作系统(鸿蒙)的软件后缀.hap
  • 算法练习第六十四天
  • 安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】
  • 实现一个宽高自适应的正方形
  • shell脚本命令
  • Vue2023 面试归纳及复习(2)
  • idea 本地项目上传到 Git 步骤
  • 【从0学习Solidity】41. WETH
  • 微信小程序的无限瀑布流写法
  • 前有CAP理论,后有BASE理论,分布式系统理论基石
  • HTTP、TCP、SOCKET三者之间区别和原理