Go
Beginner
1 min read
First-Class Functions and Closures
Example
package main
import "fmt"
// Higher-order function: takes a function as an argument
func apply(nums []int, fn func(int) int) []int {
out := make([]int, len(nums))
for i, n := range nums {
out[i] = fn(n)
}
return out
}
// Factory function returning a closure
func makeAdder(x int) func(int) int {
return func(y int) int {
return x + y
}
}
// Closure capturing a mutable counter
func counter() (increment func(), get func() int) {
n := 0
increment = func() { n++ }
get = func() int { return n }
return
}
func main() {
double := func(n int) int { return n * 2 }
nums := []int{1, 2, 3, 4, 5}
fmt.Println("doubled:", apply(nums, double))
fmt.Println("squared:", apply(nums, func(n int) int { return n * n }))
add5 := makeAdder(5)
fmt.Println("add5(3) =", add5(3))
fmt.Println("add5(7) =", add5(7))
inc, get := counter()
inc(); inc(); inc()
fmt.Println("counter:", get()) // 3
// IIFE
result := func(a, b int) int { return a + b }(10, 20)
fmt.Println("IIFE result:", result)
}