Creating Closures with Anonymous Functions in Go

Beginner

This tutorial is from open-source community. Access the source code

Introduction

In this lab, you will learn how to use anonymous functions to create closures in Golang.

Closures

You need to create a function that returns another function. The returned function should increment a variable by one each time it is called. The variable should be unique to each returned function.

  • The function intSeq should return another function.
  • The returned function should increment a variable by one each time it is called.
  • The variable should be unique to each returned function.
$ go run closures.go
1
2
3
1

## The last feature of functions we'll look at for now is
## recursion.

There is the full code below:

// Go supports [_anonymous functions_](https://en.wikipedia.org/wiki/Anonymous_function),
// which can form <a href="https://en.wikipedia.org/wiki/Closure_(computer_science)"><em>closures</em></a>.
// Anonymous functions are useful when you want to define
// a function inline without having to name it.

package main

import "fmt"

// This function `intSeq` returns another function, which
// we define anonymously in the body of `intSeq`. The
// returned function _closes over_ the variable `i` to
// form a closure.
func intSeq() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

func main() {

    // We call `intSeq`, assigning the result (a function)
    // to `nextInt`. This function value captures its
    // own `i` value, which will be updated each time
    // we call `nextInt`.
    nextInt := intSeq()

    // See the effect of the closure by calling `nextInt`
    // a few times.
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())

    // To confirm that the state is unique to that
    // particular function, create and test a new one.
    newInts := intSeq()
    fmt.Println(newInts())
}

Summary

In this lab, you learned how to use anonymous functions to create closures in Golang. Closures are useful when you want to define a function inline without having to name it.