# Functions, Multiple Returns and Closures — Go (Golang)

Source: https://www.skillbyai.com/en/go/b-funcs

> Return values and errors together.

## Results plus an error

Functions can return several values, and the idiom is to return a result plus an `error` as the last value: callers check `if err != nil`. Unwanted values are discarded with `_`. Functions are values: you can pass them as arguments and return them, and **closures** capture variables from their surrounding scope, keeping them alive between calls.

## Multiple returns, errors and a closure, run

I ran this with Go 1.27.1 (`go run .` in a module named demo, standard library only). divide returns a result and an error; the counter closure keeps its own n across calls; strconv.Atoi shows a standard library error for invalid input.

```go
package main

import (
	"fmt"
	"strconv"
)

func divide(a, b float64) (float64, error) { // multiple return values
	if b == 0 {
		return 0, fmt.Errorf("divide %v by zero", a)
	}
	return a / b, nil
}

func counter() func() int { // a closure keeps its own state
	n := 0
	return func() int { n++; return n }
}

func main() {
	if q, err := divide(10, 4); err == nil {
		fmt.Println("10/4 =", q)
	}
	if _, err := divide(1, 0); err != nil {
		fmt.Println("error:", err)
	}
	next := counter()
	next(); next()
	fmt.Println("counter:", next())
	n, err := strconv.Atoi("42x")
	fmt.Println(n, err)
}
```

Output:

```
10/4 = 2.5
error: divide 1 by zero
counter: 3
0 strconv.Atoi: parsing "42x": invalid syntax
```

## Return errors, do not ignore them

Discarding an error with _ should be a deliberate, commented choice, never a habit.

**Quiz:** What is the idiomatic way for a Go function to report failure?

- [ ] Exit the program
- [ ] Throw an exception
- [ ] Print to stderr and return 0
- [x] Return an error value as the last result

*Answer:* Return an error value as the last result. Errors are values.
