Generators

Time to check out generators. Generators are useful because they allow us to delay an expression evaluation. We only compute the expression(s) we need when we need them. Generators also conserve memory because with generators, we only create and use what we need, no more:

PrintCars("GenerateCars(1, 3)",
cars.GenerateCars(1, 3))

We will find the implementation of GenerateCars in the generate.go file:

package hof

import (
"sync"
"log"
)

func carGenerator(iterator func(int) int, lower int, upper int) func() (int, bool) {
return func() (int, bool) {
lower = iterator(lower)
return lower, lower > upper
}
}

func iterator(i int) int {
i += 1
return i
}

We define our imports. The sync import is a clue that we have a need to synchronize our Goroutines. The iterator function will be passed to the carGenerator function and will track how many cars we've generated. We'll be creating cars as per need basis.