Sebagai seorang developer pastinya kita ingin selalu UP-to-Date tentang hal-hal terbaru mengenai teknologi. Salah satunya adalah bahasa pemrograman baru yang mungkin sudah cukup sering kita dengar, yaitu Go atau Golang.

Golang dipublikasikan pada tahun 10 November tahun 2009 oleh Google company, dimana merupakan tahun yang sama dengan rilisnya NodeJS pada 27 Mei 2009.

Go merupakan bahasa yang cukup populer karena kemudahan dan caranya yang simpel dalam membuat program, selain itu hasil kompilasi yang berbentuk Binary dan mudah dalam distribusi untuk tiap platform OS menambah beberapa nilai plus pada Go.

Namun karena satu dan lain hal, ada banyak developer terutama saya sebagai developer NodeJs cukup kesulitan saat pertama kali mempelajari Go, oleh karena itu kali ini saya tertarik untuk membahas Go dari segi perspektif seorang developer NodeJS. Mulai dari sini kita akan sebut NodeJS dengan Node untuk lebih ringkas.

Sebelum pergi lebih jauh, dalam konteks ini saya tidak membahas secara detail perbedaan kedua bahasa tersebut, dari segi cara penulisan kode program dan hal-hal lain yang terbatas pada aturan umum masing-masing bahasa, melainkan secara garis besarnya saja.

Karakteristik

Kompilasi

Golang adalah bahasa yang membutuhkan kompilasi tiap kali program akan dijalankan, secara garis besar agak jauh jika kita membandingkan Go dengan Node, karena karakteristik Go adalah Compiled Program sedangkan Node adalah VM based via dimana skrip kode dikonversi ke bentuk byte code saat runtime oleh V8 Engine.

// Compile myprogram project
> go build
> ls
myprogram
> ./myprogram 
Hello...

Dari situ saja perbedaannya sudah cukup luas, dimana untuk menjalankan program Go kita perlu mengkompilasi menjadi binary file. Sedangkan pada Node kita tidak memerlukan proses tersebut, cukup mengubah file yang diinginkan, lalu dijalankan melalui eksekusi script.

// execute nodejs file
> node hello.js
Hello...

Karena itu Go lebih cocok jika disadingkan dengan bahasa yang membutuhkan kompilasi seperti C, C++, Rust dsb. Namun mengkompilasi bukan berarti Go membutuhkan waktu lama untuk dijalankan saat development, menggunakan instruksi go run <nama-file> program Go dapat dijalankan dengan sangat cepat, bahkan tidak akan sadar bahwa kita melakukan kompilasi tiap menjalankan Go program.

Eksekusi

Proses eksekusi kode program Node tidak terbatas pada nama file, struktur ataupun nama fungsi yang dipanggil. Berbeda dengan Go dimana bagian yang dieksekusi pertama kali adalah fungsi main() pada package main. Hal ini wajib, dan mirip seperti cara pemanggilan fungsi main pada Java.

Eksekusi skrip NodeJs

// file.js
const fn = () => {
  console.log('skrip di eksekusi')
}

fn()

// eksekusi melalui terminal cmd
> node file.js
skrip di eksekusi

Eksekusi skrip Golang

// main.go
package main

import "fmt"

func main() {
  fmt.Println("skrip di eksekusi")
}

> go run main.go
skrip di eksekusi

Struktur Direktori

Dalam persiapan development Go, kita memiliki kewajiban untuk mengeset environment variable GOPATH dan GOROOT pada komputer kita sebelum bisa digunakan. Pada Linux dan MacOS secara default mengarah ke ~/go sedangkan pada Windows mengarah ke %USERPROFILE%/go.

GOPATH berisi path yang diarahkan ke alamat direktori dimana folder kerja golang disimpan, sedangkan GOROOT berisi path yang menuju ke SDK binary Go terinstall. Pada direktori GOPATH akan berisi 3 folder bernama src, pkg dan bin.

> ll ~/go
total 12K
drwxrwxr-x 2 kresna kresna 4,0K Apr 23 03:32 bin
drwxrwxr-x 4 kresna kresna 4,0K Des 23 19:26 pkg
drwxrwxr-x 6 kresna kresna 4,0K Apr 16 11:40 src
  • src adalah lokasi tempat dimana kode program disimpan, kecuali untuk Go Module.
  • pkg adalah tempat dimana hasil dari package yg kita install melalui go get.
  • bin adalah tempat hasil kompilasi binary dari package yg diinstall melalui kode Go.

Sebagai catatan, sebelum Golang memasuki versi 1.11 kita diharuskan untuk menaruh folder project Go kita di dalam $GOPATH/src, sedangkan versi setelahnya kita bisa menggunakan Go Module dan menempatkan folder project kita dimanapun.

Package Manager

Dalam Node kita mengenal NPM atau yang disebut Node Package Manager, NPM wajib hukumnya untuk Node developer, baik untuk melakukan inisiasi project via npm init atau proses install-remove dependensi dan lain sebagainya.

> mkdir myawesome-app
> cd myawesome-app
> npm init -y
Wrote to /home/kresna/myawesome-app/package.json:

{
  "name": "myawesome-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Dalam Go kita tidak mengenal package manager, satu-satunya package manager hanyalah Git repository, dimana kita melakukan proses install langsung mengarah ke alamat Repository-nya. Github adalah salah satu host repository yang paling populer digunakan, namun bisa juga bila kita menggunakan repository pada host lain seperti Bitbucket atau Gitlab.

Untuk menginstall modul Go melalui repository cukup menggunakan go get -u <alamat-repo>. -u merupakan flag untuk mengambil latest release dari modul yang ingin kita install.

> go get -u github.com/jinzhu/gorm

Penggunaan Variabel

Node terkenal dengan penggunaan bahasa Javascript sebagai tumpuannya, dimana Javascript menganut konsep dynamic typing. Singkatnya, pada bahasa yang menggunakan dynamic typing kita tidak perlu mendefinisikan jenis variabel yang digunakan di dalam penulisan kode program, pendefinisian itu secara otomatis dihandle pada saat runtime. Hal yang berbanding terbalik dengan Go, dimana setiap penulisan kode program membutuhkan pendefinisian jenis variabel yang jelas.

Beberapa contoh penulisan variabel pada Node

const aNumber = 10;
const aBool = true;
const aString = 'Kresna.dev';
const anObject = {
  foo: 'bar'
}

Contoh penulisan variabel pada Go

var aNumber int = 10
var aBool bool = true;
aString := "Kresna.dev" // type inference

Namun ada sedikit yang menarik pada Go, dimana kita bisa membuat variabel berdasarkan value yang diberikan, atau biasa disebut type inference. Hal ini cukup membantu dan sering dimanfaatkan dalam menunjang produktifitas penulisan kode program di Go.

Cakupan Aplikasi

Aplikasi yang dapat dibuat menggunakan Go sangat beragam, karena Go merupakan Compiled Language maka Go sangat mungkin untuk menjadi aplikasi pada Cross Platform Desktop, Webserver, Mobile (experimental) dan bahkan IoT dan Robotics. Hal ini tentu berbeda denga Node, dimana saat ini cakupannya cukup dalam lingkup Webserver dan Desktop app (electron) saja, itu pun tentunya membutuhkan JS Engine.

Web Framework

Berbeda dengan Node yang sangat memanfaatkan web framework seperti ExpressJS, Koa, Fastify dan lain sebagainya. Go tidak selalu perlu untuk mengandalkan framework, kecuali pada aspek tertentu.

Dalam paket built-in, Go sudah sangat cukup untuk membuat aplikasi webserver sederhana, bahkan seperti yang bisa dibuat menggunakan ExpressJS pada Node. Namun tentunya jika ingin lebih efisien ataupun skala developmentnya sudah cukup luas, berikut ini adalah beberapa framework yang populer digunakan.

Popular Golang Web Framework

Distribusi / Deployment

Proses distribusi atau deployment program Go terbilang sangat mudah dan simpel. Hanya dengan go build, menghasilkan file binary yang dapat langsung dieksekusi entah melalui proses Deployment Server atau secara langsung. Karena kemudahan tersebut, membuat sebagian besar developer menyukai Go, dan juga memotong rantai panjang proses install dependensi, konfigurasi dan hal lainya sebelum proses deployment / distribusi. Hal ini sangat berbeda seperti yang terjadi pada Node dengan versi Node dan proses installasi pada node_modules nya.

Ukuran File Project

Yang paling terlihat lagi perbedaan antara Go dengan Node yaitu mengenai besaran file project atau file hasil kompilasi. Pada project Node disertakan file package.json yang memuat metadata dari sebuah program NodeJs, dimana dari sana akan terbentuk folder node_modules tempat dependensi pihak ketiga disimpan dan menjadi referensi saat program dijalankan. Beberapa keluhan muncul dari besarnya ukuran folder ini yang bisa sampai ratusan mega atau lebih.