package errors type hasInnerError interface { // Unwrap returns the underlying error of this one. Unwrap() error } func Cause(err error) error { if err == nil { return nil } L: for { switch inner := err.(type) { case hasInnerError: if inner.Unwrap() == nil { break L } err = inner.Unwrap() default: break L } } return err }