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

在 Golang 中比较时出现错误

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

在 Golang 中比较时出现错误

在Golang中进行比较操作时,有时会遇到一些错误。这些错误可能导致程序运行不正常或产生意想不到的结果。本文将通过php小编草莓的介绍,为大家解析在Golang中比较时可能出现的错误,并提供相应的解决方案。通过了解这些常见错误,我们可以更好地理解和使用Golang的比较操作,提高程序的稳定性和正确性。让我们一起来探索吧!

问题内容

今天我在尝试实现自定义错误时遇到了问题。我的服务有两种类型的错误:内部错误的常规错误和处理用户相关错误的用户错误。所以我有用于用户错误的结构,其中包含一些元数据和处理错误的函数。在此函数中,我对标准错误使用包装器。As 函数。但它的工作方式很奇怪:出于某种原因,它也将常见错误视为用户错误。 这是代码片段:

package main

import (
    "errors"
    "fmt"
)

type UserError struct {
    Message string
}

func (u *UserError) Error() string {
    return u.Message
}

func As(sourceError, targetError error) bool {
    return errors.As(sourceError, &targetError)
}

func AsV2(sourceError error, targetError interface{}) bool {
    return errors.As(sourceError, &targetError)
}

func IsUserError(err error) bool {
    var userError *UserError
    return errors.As(err, &userError)
}

func main() {
    userError := errors.New("test Error")
    var emptyError *UserError

    fmt.Println(As(userError, emptyError))
    fmt.Println(AsV2(userError, emptyError))
    
    fmt.Println(IsUserError(userError))
}

在这里,我正在测试接受两个错误并比较它们的函数(As 和 AsV2)。唯一的区别是第二个函数接受目标错误的接口而不是错误类型。在函数 IsUserError 中,我手动创建 UserError 指针并提供给Errors.As 函数。但在输出这个程序时我得到这个:

true
true 
false

所以我的问题是为什么在前两种情况下会出现错误。也就是说,这是相同类型的错误,但只有在第三种情况下它才会给出正确的答案?我是否误解了 Go 中接口的工作原理?

解决方法

事实并非如此。在前两种情况下,它正确地报告错误分别为 Errorinterface{}。您添加的不必要的包装函数正在创建一个间接,这使其更加混乱,但如果您调用:

var emptyError *UserError
fmt.Println(errors.As(userError, emptyError))

您得到了预期的结果。 IsUserError 按预期工作,因为它将正确的类型传递给 errors.Is。我已经清理了您的代码以正常工作(Error 采用非指针接收器,并且不将 emptyError 保留为 nil),您可以在此处查看它的运行情况: https://go.dev/play/p/c5EPB5IGeD5

type UserError struct {
    Message string
}

func (u UserError) Error() string {
    return u.Message
}

func main() {
    userError := errors.New("test Error")
    var emptyError UserError

    fmt.Println(errors.As(userError, &emptyError))
}

以上就是在 Golang 中比较时出现错误的详细内容,更多请关注编程网其它相关文章!

免责声明:

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

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

在 Golang 中比较时出现错误

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

下载Word文档

猜你喜欢

在 Golang 中比较时出现错误

在Golang中进行比较操作时,有时会遇到一些错误。这些错误可能导致程序运行不正常或产生意想不到的结果。本文将通过php小编草莓的介绍,为大家解析在Golang中比较时可能出现的错误,并提供相应的解决方案。通过了解这些常见错误,我们可以更好
在 Golang 中比较时出现错误
2024-02-12

事务日志较大时出现错误9002

错误9002是Microsoft SQL Server数据库引擎中的一个错误代码,表示事务日志已满。当事务日志文件的大小达到其最大限制时,将出现此错误。事务日志用于记录数据库引擎中执行的所有事务操作,包括对数据的插入、更新和删除。当事务日志
2023-09-08

waitpid在使用时出现EINTER错误

EINTR错误是指当操作被信号中断时,系统调用会返回EINTR错误。在使用waitpid函数时,可能会出现EINTR错误的原因有以下几种:1. 当前进程收到一个信号,例如SIGCHLD信号(子进程状态改变信号),导致waitpid函数被中断
2023-08-08

golang函数中的错误处理与异常处理的比较

go 语言提供两种错误处理机制:1. 错误处理:使用 err 参数返回错误,调用方需显式处理;2. 异常处理:使用 panic() 和 recover() 函数,引发并捕获异常。实战场景:错误处理常用于文件操作(返回 nil 表示成功,非零
golang函数中的错误处理与异常处理的比较
2024-04-25

在 pod 中运行特定命令时出现错误

php小编鱼仔在使用pod运行特定命令时遇到了错误。这个问题对于开发人员来说是非常常见的,但解决起来可能会有些困难。当我们在pod中执行特定命令时出现错误,这可能是由于多种因素引起的,比如版本不兼容、依赖关系问题等。在解决这个问题之前,我们
在 pod 中运行特定命令时出现错误
2024-02-09

在结构中打印 nil 错误时出现恐慌

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《在结构中打印 nil 错误时出现恐慌》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!问题内容当打
在结构中打印 nil 错误时出现恐慌
2024-04-04

尝试创建新用户时出现 Golang SQL 错误

php小编小新在使用Golang创建新用户时遇到了SQL错误的问题。这个错误可能会导致用户无法成功注册,给网站的正常运行带来困扰。针对这个问题,我们需要分析错误的原因,并找到解决方法。本文将介绍可能导致Golang SQL错误的几个常见原因
尝试创建新用户时出现 Golang SQL 错误
2024-02-13

异常处理与传统错误处理在 PHP 中的比较?

异常处理是一种结构化的错误处理机制,将错误打包成对象,提供了更健壮、结构化和可追踪的方式来处理错误,弥补了传统错误处理的局限性。异常处理与传统错误处理在 PHP 中的比较传统错误处理PHP 的传统错误处理方法依赖于函数 error_re
异常处理与传统错误处理在 PHP 中的比较?
2024-05-09

在Rstudio中安装package时出现错误如何解决

在Rstudio中安装package时出现错误如何解决?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、 install.packages(REmap)无法安装package:
2023-06-14

在 SAP HANA 中执行 UNION 时出现内存错误

SQL UNION 子句/运算符用于组合两个或多个 SELECT 语句的结果,而不返回任何重复行。要使用此 UNION 子句,每个 SELECT 语句必须具有选择相同数量的列相同数量的列表达式相同的数据类型并且拥有它们以相同的顺序在执行UN
2023-10-22

调用 firebase golang 库时出现 RPC 数据存储错误

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题是《调用 firebase golang 库时出现 RPC 数据存储错误》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎
调用 firebase golang 库时出现 RPC 数据存储错误
2024-04-04

如何在 Golang 中同时处理多个错误?

在 go 中同时处理多个错误的方法是:使用 errors.is 检查错误是否为另一个错误的底层错误。使用 errors.as 将错误强制转换为特定类型(如果可能)。使用 errors.multierror 创建一个包含多个错误的 error
如何在 Golang 中同时处理多个错误?
2024-05-14

在python中写入文件时出现错误如何解决

在python中写入文件时出现错误如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数
2023-06-14

在Golang中实现自定义错误类型

在 go 中创建自定义错误类型可提供更详细的错误消息。创建自定义错误类型:用 error 接口定义错误类型,实现 error() 方法返回错误消息。使用自定义错误类型:像使用任何其他错误类型一样使用自定义错误类型。实战案例:文件读取操作使用
在Golang中实现自定义错误类型
2024-04-15

使用 gorm 在 postgres 中的“$1”处或附近出现 golang 语法错误

学习Golang要努力,但是不要急!今天的这篇文章《使用 gorm 在 postgres 中的“$1”处或附近出现 golang 语法错误》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都
使用 gorm 在 postgres 中的“$1”处或附近出现 golang 语法错误
2024-04-04

golang 在 k8s 运算符上出现错误“对象已被修改”

php小编草莓在探索使用golang开发kubernetes运算符时,遇到了一个常见的错误:“对象已被修改”。这个错误通常发生在多个goroutine同时修改同一个对象时,导致数据不一致或竞争条件。在本文中,我们将探讨这个错误的原因和解决方
golang 在 k8s 运算符上出现错误“对象已被修改”
2024-02-13

为什么在 Go 中创建同级模块时会出现错误?

在Go语言中,创建同级模块时出现错误是一个常见的问题。这个问题的原因通常是由于模块的命名空间冲突导致的。当我们在同一个目录下创建两个具有相同名称的模块时,Go编译器会认为这是冲突的,从而导致错误的发生。解决这个问题的方法是,将这些模块分别放
为什么在 Go 中创建同级模块时会出现错误?
2024-02-09

oracle关键字在mybatis中使用时出现错误如何解决

oracle关键字在mybatis中使用时出现错误如何解决?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。解决方式 可以使用resultMap**示例代码