我的编程空间,编程开发者的网络收藏夹
学习永远不晚

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“error”声明它?这是一个常见的问题,许多 Go 语言开发者都会遇到。简单地说,Go 返回错误的方式是为了方便使用和处理错误。在 Go 中,错误是一个接口类型,它有一个 Error() 方法来返回错误消息。因此,当函数返回一个错误时,实际上是返回一个实现了 Error() 方法的结构体指针。这种设计使得错误处理变得更加简洁和灵活,减少了代码的冗余和复杂性。因此,虽然返回一个指针可能看起来有些奇怪,但它实际上是为了提供更好的错误处理机制。

问题内容

我正在从 Java 背景学习 Go 语言。

type MyError struct {
    message string
    Offset  int
}

func (Me *MyError) Error() string {
    return Me.message
}

func myFunction() (int, error) {      <-- Why the return type is "error" rather than "*error"
    return 0, &MyError{"my error message", 0} <-- The error is returned as a pointer.
}

func main() {
    var _, err = myFunction()
    if e, ok := err.(*MyError); ok {.  <-- Why I can assert err which is a type of "error" into a pointer
        fmt.Printf("Error is %s: %d\n", e.message, e.Offset)
    }
}

在上面的代码中,我不明白为什么myFunction的错误类型是“error”而不是“*error”?我清楚地在下面的行中返回了一个指向 MyError 结构的指针。

我也明白为什么我可以将主函数中的错误断言回指针。

解决方法

要了解 Go 中的传统错误处理,您应该首先了解该语言中的接口如何工作。在谈论 Go 接口时需要记住两件事:

  1. Go 中的接口定义了一组方法(从 Go1 开始.18 也是一组类型)。在幕后,Go 接口包含两个元素,类型 T 和值 VV 始终是具体类型,例如 intstruct 或指针,而不是接口本身。

  2. Go 中没有 implements 关键字。 Go 类型通过实现该接口的方法来满足该接口。这称为隐式实现。

错误处理

Go 定义了一个内置的 error 类型,它只是一个接口:

type error interface {
    Error() string
}

事实上,它没有什么特别之处,除了它是一个全局预声明类型。该类型通常用于错误处理。

以您的示例为例:

func myFunction() (int, error) {
    return 0, &MyError{"my error message", 0}
}

func main() {
    var _, err = myFunction()
    if e, ok := err.(*MyError); ok {
        fmt.Printf("Error is %s: %d\n", e.message, e.Offset)
    }
}

指向 MyError 的指针和 error 接口之间的关系发生在幕后,您不需要显式返回 *error 即可从 MyError 值引用 error (实际上,您 几乎永远不需要指向接口的指针)。

返回 myFunction 后,error 值将保存以下元组 (V=&MyError{message: "my error message", Offset: 0}, T=*MyError),其中 V 是它的值保持,T 是值 V 的类型。

因为 Go 允许您在接口值上键入断言。基本上,您要问的 Go 操作 e, ok := err.(*MyError) 是: err 值(哪种类型是 error 接口)是否将类型 *MyError 作为其底层 T?如果是这样,则 ok 将是 true,并且 e 将接收其底层 V&MyError{message: "我的错误消息", Offset: 0}

注意:请谨慎对待 nil 错误值,因为它们可能并不总是由于界面的细微差别,其行为符合预期。

以上就是为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“error”声明它?这是一个常见的问题,许多 Go 语言开发者都会遇到。简单地说,Go 返回错误的方式是为了方便使用和处理错误。在 Go 中,错误是一个接口类型,它有一个
为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它
2024-02-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录