What is a Higher-Order Function?
A Higher-Order Function (HOF) is a function that either takes another function as an argument or returns a function as its result.
This makes functions in Go more flexible and powerful by enabling concepts like callbacks, function composition, and functional programming patterns.
Characteristics of Higher-Order Functions
✅ Takes a function as an argument
✅ Returns a function as a result
✅ Enhances code reusability and modularity
✅ Common in functional programming patterns
Examples of Higher-Order Functions in Go
1️⃣ Passing a Function as an Argument
A function that accepts another function as a parameter and applies it to two integers.
package main
import "fmt"
// Higher-order function: Takes a function as an argument
func operate(a int, b int, op func(int, int) int) int {
return op(a, b)
}
// Function to add two numbers
func add(x, y int) int {
return x + y
}
func main() {
result := operate(4, 5, add)
fmt.Println("Result:", result) // Output: Result: 9
}
✅ Why Higher-Order?
-
operatetakes another function (op) as an argument. - This makes
operateflexible, as it can apply different functions likeadd,subtract,multiply, etc.
2️⃣ Returning a Function from Another Function
A function that returns another function instead of a direct value.
package main
import "fmt"
// Higher-order function: Returns a function
func multiplier(factor int) func(int) int {
return func(n int) int {
return n * factor
}
}
func main() {
double := multiplier(2) // double now holds a function that multiplies by 2
fmt.Println(double(5)) // Output: 10
}
✅ Why Higher-Order?
-
multiplier(2)returns a function that multiplies any number by 2. - The returned function is stored in
double, which can be used later.
3️⃣ Using Anonymous Functions in Higher-Order Functions
Instead of defining a separate function, we can pass an anonymous function directly.
package main
import "fmt"
func operate(a int, b int, op func(int, int) int) int {
return op(a, b)
}
func main() {
result := operate(10, 3, func(x, y int) int {
return x - y
})
fmt.Println("Result:", result) // Output: Result: 7
}
✅ Why Higher-Order?
- The
operatefunction takes an anonymous function as a parameter. - No need to define a separate function like
subtract.
First-Order vs. Higher-Order Functions
| Feature | First-Order Function | Higher-Order Function |
|---|---|---|
| Accepts another function? | ❌ No | ✅ Yes |
| Returns another function? | ❌ No | ✅ Yes |
| Example | sumArray([]int) |
operate(4, 2, func(x, y int) int { return x * y }) |
When to Use Higher-Order Functions?
✅ When writing generic, reusable functions
✅ When using callbacks or function composition
✅ When implementing custom sorting, filtering, or mapping operations
✅ When applying functional programming patterns
Top comments (0)