We’re big fans of functional languages but we can appreciate a very well designed imperative language when we see one. Golang (Go) is a great example. It’s statically typed. The huge benefit? The compiler and static analysis tools can do a lot of checking that your test suite or users would otherwise end up doing.
Go’s design philosophy is instructive and opinionated, making plenty of useful decisions for you so your engineers don’t fall into a choice paradox. For example, Gofmt defines how your code will be formatted so you don’t have to. And unit test tooling is built-in, making tests look familiar in every project.
Sometimes it feels like hard work to code in Go, especially if you’re used to dynamically typed languages like Ruby or Python, but that extra work is coding type information the compiler needs, or explicitly handling errors. These are both examples of Go’s design being more sympathetic to the machine and the realities your program will face at runtime. It has concurrency features built in as language primitives and a preference to pass by value, both of which make it easier to design robust concurrent systems.
Using Go feels slightly laborious and intellectually frustrating if you love FP but, in return, you end up having to make fewer decisions and getting more robust services. The result? A boost to your productivity. It’s great for infrastructural services, APIs, and command line tools. Though when it comes to data transformation, prototyping, or view-rendering, Go is good, but by no means excellent.