Skip to main content
improve code visually
Source Link
colm.anseo
  • 22.7k
  • 5
  • 50
  • 64

The reason you are getting false while trying to find one error within another via errors.Is is because - while the two errors may have the same field values - they are two different memory pointers:

e  := &somePointerWrapperError{"Hi!", nil} ew := fmt.Errorf("whoa!: %w", e)  e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e ew := fmt.Errorf("whoa!: %w", e)  errors.Is(ew, e) // true errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` errors.Is(ew, e) // true 

So how to detect this "type" of error and get its value: use errors.As instead:

e := &somePointerWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError   if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

The reason you are getting false while trying to find one error within another via errors.Is is because - while the two errors may have the same field values - they are two different memory pointers:

e := &somePointerWrapperError{"Hi!", nil} ew := fmt.Errorf("whoa!: %w", e)  e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` errors.Is(ew, e) // true 

So how to detect this "type" of error and get its value: use errors.As instead:

e := &somePointerWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

The reason you are getting false while trying to find one error within another via errors.Is is because - while the two errors may have the same field values - they are two different memory pointers:

e  := &somePointerWrapperError{"Hi!", nil} e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e ew := fmt.Errorf("whoa!: %w", e)  errors.Is(ew, e) // true errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` 

So how to detect this "type" of error and get its value: use errors.As instead:

e := &somePointerWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError   if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

fixed wrongly pasted type name
Source Link
colm.anseo
  • 22.7k
  • 5
  • 50
  • 64

The reason you are getting false while trying to find one error within another via errors.Is is because - while the two errors may have the same field values - they are two different memory pointers:

e := &somePointerWrapperError{"Hi!", nil} ew := fmt.Errorf("whoa!: %w", e) e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` errors.Is(ew, e) // true 

So how to detect this "type" of error and get its value: use errors.As instead:

e := someWrapperError&somePointerWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

The reason you are getting false while trying to find one error within another via errors.Is is because - while the two errors may have the same field values - they are two different memory pointers:

e := &somePointerWrapperError{"Hi!", nil} ew := fmt.Errorf("whoa!: %w", e) e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` errors.Is(ew, e) // true 

So how to detect this "type" of error and get its value: use errors.As instead:

e := someWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

The reason you are getting false while trying to find one error within another via errors.Is is because - while the two errors may have the same field values - they are two different memory pointers:

e := &somePointerWrapperError{"Hi!", nil} ew := fmt.Errorf("whoa!: %w", e) e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` errors.Is(ew, e) // true 

So how to detect this "type" of error and get its value: use errors.As instead:

e := &somePointerWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

explained why original code returned false
Source Link
colm.anseo
  • 22.7k
  • 5
  • 50
  • 64

UseThe reason you are getting errors.Asfalse instead ofwhile trying to find one error within another via errors.Is. is because - while the two errors may have the same field values - they are two different memory pointers:

e := &somePointerWrapperError{"Hi!", nil} ew := fmt.Errorf("whoa!: %w", e) e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` errors.Is(ew, e) // true 

This will confirm the error contains theSo how to detect this "type" of error type you are interested it and get its value: use errors.As instead:

e := someWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

Use errors.As instead of errors.Is.

This will confirm the error contains the error type you are interested it and get its value:

e := someWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

The reason you are getting false while trying to find one error within another via errors.Is is because - while the two errors may have the same field values - they are two different memory pointers:

e := &somePointerWrapperError{"Hi!", nil} ew := fmt.Errorf("whoa!: %w", e) e2 := &somePointerWrapperError{"Hi!", nil} // e2 != e errors.Is(ew, e2) // false - because `ew` wraps `e` not `e2` errors.Is(ew, e) // true 

So how to detect this "type" of error and get its value: use errors.As instead:

e := someWrapperError{"Hi!", nil} e2 := fmt.Errorf("whoa!: %w", e) var ev *somePointerWrapperError if errors.As(e2, &ev) { fmt.Printf("%#v\n", ev) // &somePointerWrapperError{Msg:"Hi!", Err:error(nil)} } 

https://play.golang.org/p/CttKThLasXD

tidying
Source Link
colm.anseo
  • 22.7k
  • 5
  • 50
  • 64
Loading
Source Link
colm.anseo
  • 22.7k
  • 5
  • 50
  • 64
Loading