The errctx package allows for setting and retrieving contextual information using
error objects.
err := errors.New("something bad happened")
// set the userID that caused this error
return errctx.Set(err, "userID", userID)
Later on you can get the userID back:
userID, ok := errctx.Get(err, "userID").(int64)
If you want to check the wrapped error object:
if errors.Is(err, underlyingError) {
}
Additionally, if you want to store the source of the original error you can
use Mark and Line:
err := errors.New("something bad happened")
// store the filename and line number where Mark was called
return errctx.Mark(err)
Later you can use Line to get the filename:line where Mark was first called:
fileLine, ok := errctx.Line(err)