DEV Community

Cover image for Understanding Higher-Order Functions in Go
Md Abu Musa
Md Abu Musa

Posted on

1

Understanding Higher-Order Functions in Go

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
}
Enter fullscreen mode Exit fullscreen mode

Why Higher-Order?

  • operate takes another function (op) as an argument.
  • This makes operate flexible, as it can apply different functions like add, 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
}
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

Why Higher-Order?

  • The operate function 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

AWS GenAI LIVE image

Real challenges. Real solutions. Real talk.

From technical discussions to philosophical debates, AWS and AWS Partners examine the impact and evolution of gen AI.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more