Custom error types can carry structured information while still acting like errors.

Custom Error Types

custom_error.go
package main

import "fmt"

type ValidationError struct {
	Field string
}

func (v ValidationError) Error() string {
	return "missing " + v.Field
}

func validate(value string) error {
	if value == "" {
		return ValidationError{Field: "name"}
	}
	return nil
}

func main() {
	var input = 
	err := validate(input)

	if err != nil {
		fmt.Println("valid=", false)
		fmt.Println("error=", err)
	} else {
		fmt.Println("valid=", true)
		fmt.Println("input=", input)
	}
}
package main

import "fmt"

type ValidationError struct {
	Field string
}

func (v ValidationError) Error() string {
	return "missing " + v.Field
}

func validate(value string) error {
	if value == "" {
		return ValidationError{Field: "name"}
	}
	return nil
}

func main() {
	var input = 
	err := validate(input)

	if err != nil {
		fmt.Println("valid=", false)
		fmt.Println("error=", err)
	} else {
		fmt.Println("valid=", true)
		fmt.Println("input=", input)
	}
}
package main

import "fmt"

type ValidationError struct {
	Field string
}

func (v ValidationError) Error() string {
	return "missing " + v.Field
}

func validate(value string) error {
	if value == "" {
		return ValidationError{Field: "name"}
	}
	return nil
}

func main() {
	var input = 
	err := validate(input)

	if err != nil {
		fmt.Println("valid=", false)
		fmt.Println("error=", err)
	} else {
		fmt.Println("valid=", true)
		fmt.Println("input=", input)
	}
}
Error method A type satisfies Go's `error` interface when it has an `Error() string` method.