Go: Errors explained

Go typically uses return values to indicate errors. Multivalued returns makes it easy to return an error value alongside the normal return value.

The os.Open function is a good example:

func Open(name string) (file *File, err error)

which is used as follows:

f, err := os.Open("file.txt")
if err != nil {
// do something with the open *File f

By convention the built-in error type is used:

type error interface {
    Error() string

The error interface requires only an Error method, but specific error implementations often have additional methods, allowing callers to inspect the details of the error.

To create a simple string-only error you can use errors.New as follows:

if problem {
	return errors.New("Houston, we have a problem")


In unrecovorable conditions, due to for instance programming errors, the program can call panic(err). When the program panics, it starts to unwind the call stack. This continues until the stack is empty (at which point the program crashes) or until the recover function is called. Calling panic is similar to throwing an exception in Java or C++, but instead of try/catch blocks, Go uses deferred methods and the recover method.