// Chapter 29 example: error is an interface, and your own type can satisfy it. // Run with: go run exercises/29/06-custom-error.go package main import "fmt" type levelError struct { level int } func (e levelError) Error() string { return fmt.Sprintf("level %d is not from 1 to 99", e.level) } func checkLevel(level int) error { if level < 1 || level > 99 { return levelError{level: level} } return nil } func main() { err := checkLevel(7) fmt.Println(err) // err = checkLevel(150) if err != nil { fmt.Println("Error:", err) // Error: level 150 is not from 1 to 99 } // A type assertion asks for the real type inside the interface. bad, ok := err.(levelError) if ok { fmt.Println("The level was", bad.level) // The level was 150 } }