Why Go Isn’t Always Ideal for Beginners
When I created the My Programming Language Journey section for my profile page, it reminded me just how many years I’ve been working primarily with Go. I started in 2011, and by 2015, it had effectively become my main language. But the landscape has changed significantly since then. This led me to realize that Go isn’t always an ideal language for beginners—and sometimes even for those switching from other languages.

In my early years with Go, I mostly worked with C and C++ developers who appreciated its full toolset, fast compilation, cross-platform capabilities, and simplicity. Go delivered exactly what they needed, making day-to-day work much easier. Yet, we never lost control—we could still dive deep into the system when necessary. Back then, we could often mitigate the weaknesses of garbage collection through clever use of memory pools and similar approaches.
Since around 2020, I’ve noticed Go’s growing popularity. This is driven both by developers themselves and by companies embracing a more modern direction. As a result, we’re seeing not just converts from widely used languages like Kotlin, C#, or Python, but also beginners who sometimes choose Go as their first programming language. However, Go is different—and its quirks often stand out.
When writing code to solve a problem, developers frequently rely on a collection of libraries to make life easier. This is especially true for those coming from languages like Kotlin, C#, or Python, where frameworks and extensive libraries are the norm. Go, in contrast, is much more compact, which is why converts from, say, C, often take to it quickly—at least based on my personal experience after nearly 14 years with Go.
Go is minimalist. As a result, you often end up writing more code than in other languages. It also lacks constructs like Optionals or full-fledged Generics. Go focuses on the essentials—the rest is up to your own code. Error handling is one of the first things new Go developers find “weird.” Goroutines, too, are rarely found natively in other languages, leading many to mistake them for threads (which they aren’t). This ties directly into memory management, where even thousands—or millions—of goroutines per process can be handled.
The standard library is extensive, and it quickly becomes clear that the focus is on networking and the web. It’s no surprise that Go has become the cloud language. It dominates the Cloud Native Landscape statistics with the most repositories. If you solve problems primarily using the standard library, life is easy. The language itself is only ever extended—never changed in breaking ways—so code without external dependencies will still compile with the latest Go years later.
Working with Go requires an appreciation for minimalism. Pragmatism also helps, since there’s no prescribed project structure. The recent surge in frameworks and libraries suggests that people expect more from Go. Yet, the most successful Go projects I’ve worked on avoided external dependencies wherever possible. Instead, they built small, reusable internal libraries for different projects.
To get started with Go, a background in C is incredibly helpful. After going through the Go documentation, the Go Tour, and the official Go examples, you can dive deeper into Go’s internals and runtime. And if you want to write Go code the way it’s meant to be written, I highly recommend Effective Go as final reading.