It’s no secret amongst my colleagues that I’m a big fan of Go. I’ve been following it for a few years and I finally got to use it in production last year when I introduced it to the micro-service architecture stack at my current client.
The value of technology is in its application, not in and of itself. The value of a tool is what it enables you to achieve, how efficiently you can achieve it and the quality of the result. All tools require an investment of resources. The value of the tool is the delta between that investment and the result.
From my starting point Go required little investment to become reasonably proficient. It’s genealogy is C so as a C# hack it looks familiar, but the syntax of a language is actually a fairly trivial matter. The lack of inheritance was an easy adjustment to make as before Go appeared on my radar I was tending to often prefer composition over inheritance anyway. Dependency injection; an easy concept to grasp but not quite so easy to implement in C# or Java. It requires careful consideration with regard to interfaces, where they are defined and there are a myriad of containers to choose from. Great once you are up the curve easy enough but still there is a curve. The implicit interface model in Go takes a lot of this pain away.
If Go has a killer feature it is CSP. You haven’t earned your stripes until you have tied yourself in knots working with mutexes and threads. If you haven’t seen Rob Pike’s presentation Concurrency is not Parallelism then I suggest you do if this is a topic that interests you. Likewise the excellent Seven Concurrency Models in Seven Weeks by Paul Butcher is a must read.
I have rambled slightly here. It feels like the sort of post I will revise again and again over time as I have definitely missed some important details out in this first pass, but I started it with a single point that I wanted to get across. When I learned the other languages I know I felt like I was putting a lot of effort into learning that language. Over the years I learned the greater lessons around patterns, TDD, CI, code/package de-coupling, the value of immutability, IoC, SOLID and probably lots of other elements that slip my mind right now. Concepts and ideas that transcend a particular language. Go let’s me employ them all without getting in the way and as such that delta between tool investment and result is high. That is why I like Go, it doesn’t get in the way or make me jump through hoops, it just let’s me express what I need to express without objection.