This will be a series of tutorials about Go language. The first post is a bit boring and talks about the current Go ecosystem and the language’s overview. As well as its advantages and disadvantages.
I’ve been working with Node.js for many years and then with Go within my latest projects. I’ve been programming since 10 years old for 25+ years (guessed my age?). I want to share what I learnt with you.
I’ll go into the details of each piece of information here in this post afterwards, in the next posts. This post is here for giving you a quick overview of Go without going into the language specific details and tutorials.
Open Source Language
It’s an open source programming language from Google. Made its first stable release, 2011.
What does it mean that it’s an open source programming language? Well, it’s created by Google as I said. However, even you can contribute to it by creating new proposals, fixing bugs, making it faster. It’s like a living being growing in front of you. If you’re curious, its source code is hosted here on Github.
Who created Go?
Robert Griesemer, Rob Pike and Ken Thompson. They started designing the language around 2007. The language open-sourced in 2009. Read more here.
Go design inspired from languages like Algol, Pascal, C, Modula, Oberon, Smalltalk and Newsqueak.
Go inherited mostly from Oberon language and its syntax is from C. Go’s OOP is more like Smalltalk but in Go, you can attach methods to any type. And concurrency is mostly from Newsqueak which is a language also from Rob Pike and heavily inpired from Hoare’s paper of CSP (Communicating Sequential Processes).
Why they created Go?
Programming in a compiled language like C is not fast because of the compilation step. However, working with an interpreted language like Ruby is fast, because it’s interpreted and you can see the results fast after you save the source code.
Go removes all of these obstacles like safety, speed and ease of programming
Fast results: It works like an interpreted language because of the fast compilation. You’ll not notice that it’s compiling. You’ll think that as if you’re working in an interpreted language like Ruby.
Safe: Strongly and statically typed and garbage collected. Strongly typed means: You can’t pass any type of data everywhere. You need to be explicit. Statically typed means: Compiler knows the type of every variable.
Easy to work with: It’s concise, explicit and easy to read.
Modern: Built-in support in the language itself for multicore networked distributed applications and more.
Go has idioms
“Get the job done”
“One-way of doing things”: It’s called idiomatic Go code.
“Being explicit”: Explicitness is favored even it’s not DRY. Duplication is allowed sometimes.
“Build things by composing them”: Do not inherit from other things, compose systems from simpler components. Although, it “inherits” this mantra from Unix philosophy.
Who uses Go?
There are at least 2 millions programmers in the Go community.
Most notable companies are: Google, Docker, Dropbox, Heroku, Medium, Lyft, Uber, and others.
Go has the cutest mascot ever. OK…, Let’s see the real advantages.
There is no VM. It compiles directly to the machine code which is fast, fast and fast (did I say fast?).
Fast compilation. The programming language design is built for fast compilation in mind from the beginning.
Compiles cross-platform to OS X, Linux, Windows, 👉 and many others.
Creates only one executable file output after the compilation without any dependencies, so that you can upload it anywhere which Go supports and just run it. Or just compile it there after you upload the code.
Strong and static typed.
Garbage collected. It cleans-up your dirt after you and integrates the whole garbage collection system into your executable binary.
Reliable. You can really create a very reliable software with Go. Because, the inherent language design prevents you from doing awful stuff with it. For example: It has pointers but they’re mostly not dangerous as in C because the memory is being managed by Go and pointer arithmetic is not advised by default.
It’s an imperative language. Which is an advantage and a disadvantage to some people.
Supports a different kind of object-oriented programming (OOP). I come from many OOP languages like Java, C#, Ruby, but, Go gets the best practices from OOP and lets you program differently, in a Go way.
Go wants you to compose things not inherit like in other OOP langs.
Supports interfaces (as in OOP). This helps composing things. Polymorphism rings a bell?
Supports functional programming (FP).
Built-in concurrency. There are no heavy threads but channels.
Almost all of the things built into its standard library (which is the library that comes with Go by default) like http fetching, json parsing, and encryption. So, this makes you faster and prevents fragmentation in the ecosystem (most of the time).
Example Tool:go fmt automatically rearranges your code for you after each save (if you configured that in your text editor).
Example Tool:go lint makes suggestions to improve your Go code.
$ go lint nocomment.go nocomment.go:3:1: comment on exported function NoComment should be of the form "NoComment ..."
Some disadvantages of using Go:
No generics support. Actually, I’m not counting this as a disadvantage although I put it here. Because, it lets you create very explicit code. Too much abstraction comes with a cost of difficult understanding the code. I’m not in the camp of generics support in Go. However, Go team is still considering adding generics support to the language.
About generics (kind of), there’s a great article from Shawn McGrath about the beauty of Doom’s (the game) source code. Especially, read the part: “Minimal Templates”, I couldn’t agree more.
Err everywhere. You need to check errors for each of the error producing function in your code explicitly. Again, for me, this is not a disadvantage, I love the explicitness of Go programs.
There are some proposals to change error handling which I don’t like them at all.