Part 4: Node vs Go
Although Go is a bit more restrictive than NodeJS, it at least moves the language itself out of the way, which is what I like most about it. Formatting/linting, modules, types and async are all pretty standard in Go, to the point that most applications look very similar. All of the decisions I talked about in Node just sort of vanish, and in a way Node's weakness is Go's strength.
Type System
The type system in Go is very similar to Typescript, and focuses on simplicity rather than completeness. The main advantages of Go over Typescript, however, is that a) it is built into the language and therefore consistent across all projects and b) it is memory optimized/serializable, not just an annotation.
Typescript is a developer convenience that improves the scalability of a project, while Go types are part of the language and can be used to better allocate memory. There are no memory benefits with Typescript, so you’re only getting half the benefits of a typed language. The same goes for type annotations in Elixir, they are only used to aid development and are completely optional.
Binaries & Goroutines
Go does have a runtime and garbage collection just like Node and Elixir (but not Rust), but it does compile down to a binary and is closer to the metal than an interpreted language like NodeJS or Elixir (although Elixir does compile down to bytecode at least). Binaries are much nicer to work with than less convenient runtimes (V8, Erlang VM, JVM etc) and much more compact and efficient.
Another nice aspect of Go is it reads like synchronous code, and has a simple, standard primitive for async work called goroutines. Goroutines are fairly straightforward to work with, and unlike NodeJS you don't have to pick goroutines over a million other options. With Go you also won't be writing async code all over the place because that kind of code is usually implemented in many of the libraries and drivers you will use.
Enterprise
In my opinion, Go is more of a competitor to Java than it is a competitor to Node or Elixir. By sticking to a familiar C-like syntax, designing a simplified typesystem over a language like Java, and making it really easy to write idiomatic code, Go has been quickly taking over Java in the enterprise, where it really excels. In a large organization with hundreds or even thousands of engineers, a consistent, easy but powerful language is of the utmost importance, and there really aren't a lot of great options available.
Summary
Although I personally find Go a little boring and not particularly innovative, it really nails enterprise development with the careful and clever design of the language. It isn't a language designed around technical achievement but instead focuses on making it easier to manage complex, large-scale projects with some level of consistency and sanity. Useful, just not exciting, kind of like enterprise development itself!
If I had to summarize why Go is a better option than NodeJS I’d say that all of those decisions you need to make, that do have a real cost, simply vanish with Go, so you can get straight to programming. It can be a little awkward to work with for expressing complex domains, but Go excels at system and CLI tools, and is not a bad choice for APIs and web servers either.