Tags: #go #errors
package main
import (
"errors"
"fmt"
"io"
)
func main() {
err := doSomething()
fe := &FooError{}
if errors.As(err, fe) {
fmt.Printf("it's a FooError: %#v\n", fe) // &main.FooError{Op:"doSomething", Err:(*errors.errorString)(0x556720)}
fmt.Printf("%#v\n", fe.Op) // "doSomething"
fmt.Printf("%#v\n", fe.Err) // &errors.errorString{s:"EOF"}
}
}
type FooError struct {
Op string
Err error
}
func (e FooError) Error() string {
return fmt.Sprintf("operation %s: %v", e.Op, e.Err)
}
func (e FooError) Unwrap() error {
return e.Err
}
func doSomething() error {
return FooError{
Op: "doSomething",
Err: io.EOF,
}
}