paint-brush
About Go Language — An Overviewby@inanc
1,046 reads
1,046 reads

About Go Language — An Overview

by Inanc GumusSeptember 20th, 2017
Read on Terminal Reader
Read this story w/o Javascript
tldt arrow

Too Long; Didn't Read

<em>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.</em>

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - About Go Language — An Overview
Inanc Gumus HackerNoon profile picture

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?

Fast languages like C, are difficult to work with and not safe. Compiling speed, dependencies and runtime errors are vast. Interpreted languages like Java and Ruby are safe but they’re slower and have many dependencies, one of them is the interpreter itself, the virtual machine which is needed to run the code. Javascript and Node.js is a wild kid; which is interpreted, weakly-typed and unsafe to work with (although there are some workarounds).

Also, as an example, Java became too complex and verbose to write. There are many keywords which can be guessed from the context the language constructs inside in (which is called inferring). Ruby is joyful to work with however it’s not designed for speed in mind. Javascript lets you free, go wild and slowly kills you (maintainance nightmare, callback hell, no built-in solutions for safety).

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.

Percentage of Stack Overflow questions for Go

Most used and wanted languages in 2017

By GitHub Pull Requests

https://www.tiobe.com/tiobe-index/

Also see: Go 2016 Survey Results.

Some advantages of using Go:

Go has the cutest mascot ever. OK…, Let’s see the real advantages.

Compiled

  • 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.

Safe

  • 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.

Paradigms

  • 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).

Concurrent

  • 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).

Tooling

  • Great built-in command-line tools. Auto-formatting your code, checking race-condition issues, auto-documentation, test coverage reporting, refactoring tools etc.
  • Example Tool: go fmt automatically rearranges your code for you after each save (if you configured that in your text editor).

Before `go fmt`

After `go fmt`

  • Example Tool: go lint makes suggestions to improve your Go code.


$ go lint nocomment.gonocomment.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.

res, err := http.Client.Get("http://ip.jsontest.com/")




// there are no try-catch exceptions in Go, check errors explicitlyif err != nil {return err}

// ...

  • No function overloading support.
  • Strict rules. Sometimes an advantage, sometimes a disadvantage. For example: Can feel little heavy when you have ever changing structs.
  • Smaller number of packages as compared to other ecosystems like Node.js and Ruby. However, it’s increasing.

Go packages

Ruby and Nodejs packages

Some links for more brain-food:

You made it here! Thanks for reading!

❤️ Please Add claps! Share it on twitter!

🐦 I’m mostly tweeting about Go: @inancgumus.

🔥 I’m creating an online course for Go: Join to my newsletter!

Let’s stay in touch weekly for new tutorials and for my online Go course.

Originally published at medium.com on September 20, 2017 in “I’m Learning Go” publication, click this link to subscribe to the publication.