Go is a procedural programming language. It was developed in 2007 by Robert Griesemer, Rob Pike, and Ken Thompson at Google but launched in 2009 as an open-source programming language. Programs are assembled by using packages, for efficient management of dependencies. This language also supports environment adopting patterns alike to dynamic languages. For eg., type inference (y := 0 is a valid declaration of a variable y of type float).
Beginning with Go programming
There are various online IDEs such as The Go Playground, repl.it, etc. which can be used to run Go programs without installing.
For installing Go in own PCs or Laptop we need of following two software: Text editor and Compiler
Text Editor: Text editor gives you a platform where you write your source code. Following are the list of text editors:
- Windows notepad
- OS Edit command
- Brief
- Epsilon
- vm or vi
- Emacs
- VS Code
Why they created Go?
Fast languages like C, are difficult to work with and not safe. Compiling speed, dependencies and runtime errors are vast. An interpreted language like Ruby is safe but it’s slower and has many dependencies, one of them is the interpreter itself. Also, for Java, for example, a virtual machine is needed to run the code. Javascript and Node.js are wild kids; which are interpreted, weakly-typed and unsafe to work with (although there are some possible directions like TypeScript or compiling directly to Javascript from other safer languages).
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 (maintenance nightmare, callback hell (the world before async await), no built-in solutions for safety).
For example, C language compiles very quickly, however, the language itself has not been designed to be compiled very fast (I’m not talking about the compiler here), so, C programmers can misuse the language facilities to create slow compiling programs. In Go, however, it’s been designed for fast compilation in mind from the beginning. So, it’s hard for Go programmers to create slow compiling programs as compared to other languages like C or C++.
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. In Go there are no implicit type conversions, for example, uint8 and uint16 are different types (except in some cases).
- Easy to work with: It’s concise, explicit and easy to read.
- Modern: Built-in support in the language itself for multi-core 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 if 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.
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 (if we exclude Go’s intermediary assembly) 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. No dependency hell.
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 as dangerous as in C because the memory is being managed by Go and pointer arithmetic is not advised by default.
👉However, this reliability is only for the compilation part, in runtime, nasty things can happen, if you want maximum run-time reliability, you may prefer, for example, Rust instead.
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 to compose things. Does “Polymorphism” ring a bell? Go does not force you to mark your types as “implements this and that interface”, it infers this from the functionality the type supports. This increases flexibility and composability.
- Go lets you attach functions to any type. This flexibility lets you compose your programs from smaller things. When a type implements the functions of an interface it’s said that the type satisfies that interface and can be used in places that desire that interface.
- Supports functional programming (FP). For example, Go supports anonymous functions, closures, and first-class functions.
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 a very explicit code. Too much wrong abstraction comes with a cost of difficult understandability. Generics are good to some extent however they’re very open to misuse and I’ve seen this in action for years. So, I’m not in the camp of generics support in Go. However, the Go team is still considering adding generics support to the language.
- About generics (kind of), there’s a great article from Shawn Mcrath 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. However, I love the explicitness of Go programs. In the upcoming years maybe we’d find an elegant solution for this. There are some proposals to change error handling.