Back to notes

Why I Chose Go for Backend Services

Exploring the pragmatic reasons behind choosing Go over other languages for building performant, maintainable backend services in enterprise environments.

When I first started building backend services, C# with ASP.NET was my go-to stack. It’s mature, well-documented, and the tooling is excellent. But as I started working on services that needed to handle high concurrency with minimal resource consumption, I found myself reaching for Go more and more.

The Concurrency Model

Go’s goroutines and channels make concurrent programming feel natural. Instead of dealing with thread pools, async/await patterns, and the cognitive overhead of Task-based parallelism, Go lets you write concurrent code that reads almost like sequential code.

func processOrders(orders []Order) []Result {
    results := make(chan Result, len(orders))
    for _, order := range orders {
        go func(o Order) {
            results <- process(o)
        }(order)
    }
    // Collect results
    var out []Result
    for range orders {
        out = append(out, <-results)
    }
    return out
}

This simplicity matters when you’re building services that will be maintained by a team. Less cognitive overhead means fewer bugs.

Deployment Simplicity

A Go binary is a single, statically-linked executable. No runtime to install, no dependency hell, no “works on my machine” problems. This is a massive win when you’re deploying to containers — your Docker images can be built FROM scratch and weigh under 20MB.

Compare that to a .NET service that needs the ASP.NET runtime, or a Node.js service that ships node_modules. The operational simplicity of Go is hard to beat.

When I Still Choose C#

Go isn’t always the answer. For complex business logic with rich domain models, C#‘s type system, LINQ, and Entity Framework still shine. When I’m building a full enterprise application with complex queries, reporting integrations (PowerBI, Metabase), and SAP connectivity — C# with .NET is the better fit.

The key is picking the right tool for the job. Go for lightweight, high-concurrency services. C# for rich enterprise applications. They complement each other well.

The Bottom Line

Choosing a language isn’t about what’s trendy — it’s about what makes your team productive and your system reliable. Go has earned its place in my toolkit alongside C#, and the combination covers almost every backend scenario I encounter.

Back to notes