Skip to content
Go back

On Go

Published: Jul 15, 2025
Updated: Nov 15, 2025
Punta Cana, Dominican Republic → Vancouver, BC, Canada

Krzysztof Kowalczyk put a name to a feeling I couldn’t shake: Go is an 80/20 language [1]. It’s the very idea I was exploring in Agent-Friendly Go and Agentic Go. Krzysztof notes that for web development, writing Go is ‘almost as fast and fluent as writing in Python’ [2]—a surprising claim that upends common wisdom.

After a decade of writing Python for clients, Go’s design feels radical. I’ve seen the complexity it deliberately avoids.

It delivers 80% of the utility for 20% of the complexity. This isn’t a flaw; it’s a philosophy. The frustration some developers feel is a longing for that last 20%, a desire that ignores its hidden cost.

This trade-off is the entire point, a philosophy championed by co-creator Rob Pike. He understood that the final slice of utility demands a disproportionate price from a language’s creators and its users.

The 80/20 Rule in Practice

This philosophy manifests in design choices that favor pragmatism over features.

  • Concurrency: Goroutines are a classic 80/20 trade-off. They offer fewer controls than the complex async/await models I detailed in my thoughts on Rust, but for most concurrent tasks, they are far simpler to use and reason about. The go keyword is powerful enough for massive, true parallelism.

    The contrast with Python is stark. Its async/await model runs on a single-threaded event loop, limiting concurrency to I/O-bound work [4]. The community acknowledges that the Global Interpreter Lock (GIL) makes it suitable for web servers but not for CPU-bound tasks. Go’s goroutines handle both with equal ease, offering one simple tool for nearly every use case.

  • Interfaces: Go’s interfaces are another example. There’s no implements keyword. If a type has the required methods, it conforms. This structural, compile-time ‘duck typing’ cuts boilerplate and makes polymorphism feel effortless—a pattern simple enough for both humans and AI agents.

  • Standard Library: The standard library is a monument to the 80/20 rule. It provides a robust, high-performance HTTP server, powerful templating, and native JSON/XML handling. You can build and deploy serious web services without a single third-party framework [2].

  • Deployment: Go’s deployment model is a game-changer. Cross-compiling a static, dependency-free binary for any platform (like building a Linux executable on a Mac) eliminates entire classes of dependency and environment issues common in other ecosystems.

The Hidden Tax of Complexity

Chasing that last 20% of utility imposes a steep tax, paid in three ways:

  1. On Language Users: Every feature adds cognitive overhead. You have to learn its syntax, its idioms, and when not to use it. This is why complex languages need extensive style guides, like Google’s for C++ [3], to rein in the language and enforce consistency.

  2. On Language Implementers: A feature-rich language is exponentially harder to build and maintain. Swift is a cautionary tale; its compiler has struggled with speed and stability. Go’s simplicity, in contrast, enabled a fast, cross-platform, and reliable compiler from day one.

  3. On the Ecosystem: Python’s async/await reveals the cost of a ‘two-colored’ ecosystem. Library authors must often maintain parallel synchronous and asynchronous implementations, duplicating effort [4]. This fractures the ecosystem, forcing developers to navigate awkward APIs where some methods need await and others don’t. Go sidesteps this entirely. Any function can run concurrently with a simple go prefix, preserving a single, unified ecosystem.

The Agentic Advantage

This philosophy is why Go shines in the agentic era. AI agents thrive on simplicity, predictability, and stability—Go’s core strengths. The explicit if err != nil pattern is trivial for an agent to generate. The small, stable standard library means an agent’s training data ages well. The language’s patterns, from context propagation to structural interfaces, leave little room for ambiguity.

The developer experience tells the same story. In Python, it’s easy to forget an await and wonder why a function never ran, or to use time.sleep(10) and accidentally freeze an entire application by blocking the event loop [4]. You have to remember the special asyncio.sleep() instead.

Go sidesteps this entire class of errors. A time.Sleep() in a goroutine blocks only that goroutine. No special functions, no forgotten keywords, no frozen apps. This predictability is invaluable for both human developers and AI agents.

While some languages embrace complexity for ultimate control, as I explored in my thoughts on Rust, and others pursue radical simplicity, which I detailed in my post on Zig, Go strikes a unique and pragmatic balance. By embracing the 80/20 rule, its designers built more than a productive language for humans; they built an ideal partner for AI. In a world drowning in complexity, simplicity is the ultimate advantage.

References

  1. Go is 80/20 language
  2. Thoughts on Go after writing 3 websites
  3. Google C++ Style Guide
  4. Why isn’t Python async more popular? by Tony Baloney
  Let an Agentic AI Expert Review Your Code

I hope you found this article helpful. If you want to take your agentic AI to the next level, consider booking a consultation or subscribing to premium content.

Content Attribution: 50% by Alpha, 50% by gemini-2.5-pro
  • 50% by Alpha: Original ideas, comprehensive initial draft including structure, all research (quotes and links).
  • 50% by gemini-2.5-pro: Content editing, prose refinement, and structural improvements.
  • Note: Attribution analysis performed by gemini-2.5-pro. 50/50 collaboration between Alpha's research and draft, and AI's content editing.