Creating Python's next() alternative using Go Closures

πŸ“… June 4, 2020 β€’ πŸ•£ 1 min read β€’ 417 totalwords

If you don’t know what next() in python means, the below code illustrates it.


MCU_Movies = iter(["Iron Man", "Thor", "Captain America: The first Avenger"])
x = next(MCU_Movies)
print(x, end="\n")
x = next(MCU_Movies)
print(x, end="\n")
x = next(MCU_Movies)
print(x)

So if you had guess this would print

Iron Man
Thor
Captain America: The first Avenger

The next() function is used to get the next item in an iterator.

Go doesn’t have a next method (nor the concept of iterators actually) so we will try to achieve something similar using Closures.

  • A closure is implemented through a anonymous(function with no name) function, basically closure is an instance of function.
  • In Go functions are first class citizens, meaning we can do all sort of things with them, assign them to a variable, pass as an argument to another function.

Below is a naive implementation of how this could look in Go. Ping me if you have a better way to do this ;)


package main

import "fmt"

/*
nextIterator returns another function, which we define anonymously in the body of nextIterator.
The returned function closes over the variable index to form a closure.
*/
func nextIterator(array []int) func() int {
    index := -1

    return func() int{
        index++
        return array[index]
    }
}
func main() {

	// an integer array
    var prices = []int{7, 1, 5}

    // create an instance of the anonymous function. i.e, a closue
    next := nextIterator(prices)

    // call the closure
    fmt.Println(next())
    fmt.Println(next())
    fmt.Println(next())

}

Here is a sample output

7
1
5

See this demo on Go Playground.