In Go, a closure is a special type of anonymous function that can capture variables from its defining scope. This means the function can access and modify variables defined in the outer function, even after the outer function has completed execution.
The basic steps to create and use closures are as follows:
1. Defining Closures
Closures are typically defined within a function and returned. This inner function accesses and modifies variables from the outer function's scope.
gopackage main import "fmt" func outerFunction() func() int { var x int = 0 return func() int { x += 1 return x } }
In this example, outerFunction returns an anonymous function that increments the value of variable x and returns it each time it is called. x is defined within outerFunction, so the anonymous function forms a closure by capturing the current and subsequent states of x.
2. Using Closures
Once defined, you can use a closure just like a regular function, but it remembers and operates on the state of its closure variables.
gopackage main import "fmt" func main() { increment := outerFunction() // Create closure fmt.Println(increment()) // Output: 1 fmt.Println(increment()) // Output: 2 fmt.Println(increment()) // Output: 3 }
Each time increment is called, it increments the value of x defined in outerFunction. Although calling outerFunction creates a new x each time, increment uses the same x.
Closures allow you to bind state with functionality, making them ideal for creating private variables and constructor factories, among other scenarios. In Go, due to the nature of closures, they are commonly used to create generators, iterators, and other structures.