4

Context: I am doing unit tests and was trying to check if I got expected errors.

I didn't have the expected result so I tried something simple which is comparing to exact errors and I was surprise that the comparison returned "false"

e1 := errors.New("error")
e2 := errors.New("error")
fmt.Println(e1 == e2) // false

Run Example: https://play.golang.org/p/cvjjiJT_5T

Can someone explain me why this returns false and how to properly check equality between errors ?

kenfire
  • 1,305
  • 12
  • 23
  • 3
    errors.New returns pointer to value. e1 / e2 are different pointer to different values. Equality test is necessarily false because it will check the pointer address, not inner values. you can see this using %#v format https://play.golang.org/p/Vu5kaBhh6y. Use strongly typed errors and type assertions instead. –  Dec 08 '17 at 11:17
  • You can take a look at https://github.com/stretchr/testify unit test library. It contains functions such as assert.Equal(t, err1, err2) which handles the error comparison in a proper way. – sonan Sep 24 '21 at 10:00

1 Answers1

11

You're creating two different error variables with the same error message. When you compare them with ==, you get false because they're not the same variables.

If you want to compare the error messages, try e1.Error() == e2.Error(). However, comparing error messages still isn't a good idea. You might consider creating some error constants (e.g. e1 == ErrContentNotFound) or adding some ID to your errors and compare that (e.g. e1.ID == ContentNotFoundID). Check https://dave.cheney.net/2016/04/07/constant-errors (and the related posts in that link) for more details.

cd1
  • 15,908
  • 12
  • 46
  • 47