Error while comparing in Golang
When performing comparison operations in Golang, you sometimes encounter some errors. These errors may cause the program to behave improperly or produce unexpected results. This article will use the introduction of PHP editor strawberry to analyze the errors that may occur when comparing in Golang and provide corresponding solutions. By understanding these common errors, we can better understand and use Golang's comparison operations and improve the stability and correctness of the program. Let’s explore together!
Question content
I ran into a problem today while trying to implement a custom error. My service has two types of errors: regular errors for internal errors and user errors for handling user-related errors. So I have a structure for user errors that contains some metadata and functions to handle the errors. In this function I use a wrapper for standard error. As function. But the way it works is weird: for some reason, it also treats common errors as user errors. Here is the code snippet:
<code>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)) } </code>
Here I'm testing a function that accepts two errors and compares them (As and AsV2). The only difference is that the second function accepts the target error's interface instead of the error type. In the function IsUserError I manually create the UserError pointer and provide it to the Errors.As function. But when outputting this program I get this:
true true false
So my question is why the error occurs in the first two cases. That is, it's the same type of error, but only in the third case does it give the correct answer? Am I misunderstanding how interfaces work in Go?
Solution
This is not the case. In the first two cases, it correctly reports errors as Error
and interface{}
respectively. The unnecessary wrapper function you added is creating an indirection which makes it even more confusing, but if you call:
var emptyError *UserError fmt.Println(errors.As(userError, emptyError))
You get the expected result. IsUserError
works as expected because it passes the correct type to errors.Is
. I've cleaned up your code to work properly (Error
takes a non-pointer receiver and doesn't leave emptyError
as nil
), you can check it here See it in action: 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)) }
The above is the detailed content of Error while comparing in Golang. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



OpenSSL, as an open source library widely used in secure communications, provides encryption algorithms, keys and certificate management functions. However, there are some known security vulnerabilities in its historical version, some of which are extremely harmful. This article will focus on common vulnerabilities and response measures for OpenSSL in Debian systems. DebianOpenSSL known vulnerabilities: OpenSSL has experienced several serious vulnerabilities, such as: Heart Bleeding Vulnerability (CVE-2014-0160): This vulnerability affects OpenSSL 1.0.1 to 1.0.1f and 1.0.2 to 1.0.2 beta versions. An attacker can use this vulnerability to unauthorized read sensitive information on the server, including encryption keys, etc.

The article discusses writing unit tests in Go, covering best practices, mocking techniques, and tools for efficient test management.

The article explains how to use the pprof tool for analyzing Go performance, including enabling profiling, collecting data, and identifying common bottlenecks like CPU and memory issues.Character count: 159

The library used for floating-point number operation in Go language introduces how to ensure the accuracy is...

Queue threading problem in Go crawler Colly explores the problem of using the Colly crawler library in Go language, developers often encounter problems with threads and request queues. �...

This article introduces a variety of methods and tools to monitor PostgreSQL databases under the Debian system, helping you to fully grasp database performance monitoring. 1. Use PostgreSQL to build-in monitoring view PostgreSQL itself provides multiple views for monitoring database activities: pg_stat_activity: displays database activities in real time, including connections, queries, transactions and other information. pg_stat_replication: Monitors replication status, especially suitable for stream replication clusters. pg_stat_database: Provides database statistics, such as database size, transaction commit/rollback times and other key indicators. 2. Use log analysis tool pgBadg

Backend learning path: The exploration journey from front-end to back-end As a back-end beginner who transforms from front-end development, you already have the foundation of nodejs,...

The problem of using RedisStream to implement message queues in Go language is using Go language and Redis...
