Belajar Pemrograman Golang
Assalamualaikum wr wb. Masih dalam rangka mengisi akhir pekan di penghujung tahun 2024, saya akan menulis pengalaman singkat belajar bahasa pemrograman golang. Sebagai pengantar, bahasa pemrograman golang pada awalnya dikembangkan oleh google, dan hingga kini sudah banyak mengalami perkembangan. Golang itu sendiri biasanya cukup disingkat “go”. Proses instalasinya cukup mudah karena biasanya sudah terintegrasi dengan paket pada distro Linux. Misalnya untuk distro Fedora, proses instalasinya bisa menggunakan dnf
seperti ini:
$ sudo dnf install golang
Atau jika hanya ingin menggunakan sendiri golang tanpa harus melakukan instalasi pada sistem, cukup unduh, ekstrak lalu set PATH
dimana golang berada. Maka golang sudah dapat digunakan. Caranya seperti ini:
- Unduh dulu arsip golang yang terbaru, misalnya versi 1.23.4:
$ cd ~
$ wget https://go.dev/dl/go1.23.4.linux-amd64.tar.gz
- Ekstrak arsip yang sudah didownload tadi:
$ tar xvf go1.23.4.linux-amd64.tar.gz
- Tambahkan
PATH
ke binary golang pada~/.bashrc
atau sesuai dengan shell yang digunakan:
PATH="$HOME/go/bin:$PATH"
export PATH
- Jika sudah selesai, maka golang sudah dapat digunakan:
$ go version
go version go1.23.4 linux/amd64
Setelah semua proses di atas rampung, waktunya untuk membuat aplikasi “hello world” menggunakan golang. Berikut ini adalah kode untuk aplikasi “hello world” menggunakan golang:
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
Simpan kode di atas dengan nama hello.go
. Setelah itu ada 2 cara yang dapat dilakukan, yaitu menjalankan kodenya dengan perintah go run
atau mengubah kodenya menjadi executable dengan perintah go build
. Cara pertama adalah langsung menjalankan kode tersebut seperti ini:
$ go run hello.go
hello world
Cara kedua adalah dengan melakukan kompilasi yang akan menghasilkan executable:
$ ls *
hello.go
$ go build hello.go
$ ls *
hello hello.go
$ ./hello
hello world
Jika melihat executable hasil kompilasi golang, maka nampak bahwa ukurannya cukup besar:
$ ls -lh hello
-rwxr-xr-x. 1 riri riri 2.1M Dec 29 16:53 hello
Ukuran tersebut dapat dikurangi dengan menghilangkan informasi debug pada executable keluarannya menggunakan opsi kompilasi -ldflags=”-s -w -buildid=”
seperti ini:
$ go build -ldflags="-s -w -buildid=" hello.go
$ ls -lh hello
-rwxr-xr-x. 1 riri riri 1.4M Dec 29 16:57 hello
Nampak penurunannya cukup signifikan. Bisa terlihat bahwa executable hasil kompilasinya sudah tidak memiliki simbol debug:
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
Namun ukurannya masih tergolong besar karena tipe executablenya adalah “statically linked”, dimana executable tersebut tidak membutuhkan library atau pustaka eksternal:
$ ldd hello
not a dynamic executable
Ukurannya dapat dibuat lebih kecil lagi dengan menggunakan opsi output dinamis (dynamically linked). Caranya pernah dibahas pada slide golang yang bisa dibaca di sini. Pertama, lakukan instalasi “standard library” sebagai “shared libraries”:
$ go install -buildmode=shared std
Kemudian lakukan kompilasi ulang dengan menambahkan opsi -linkshared
seperti ini:
$ go build -ldflags="-s -w -buildid=" -linkshared hello.go
Periksa ukuran executable yang dihasilkan:
$ ls -lah hello
-rwxr-xr-x. 1 riri riri 16K Dec 29 17:19 hello
Terlihat bahwa kini ukurannya berkurang sangat drastis hingga hanya berukuran 16 KB. Periksa kembali informasi executablenya:
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=5aad60069b34544f88c3cd2a8fc75a626a7379cc, for GNU/Linux 3.2.0, stripped
Bisa terlihat bahwa executable yang dihasilkan kini tipenya adalah “dynamically linked”, dimana executable tersebut memerlukan dependensi tertentu agar dapat dijalankan. Untuk melihat dependensinya, gunakan perintah ini:
$ ldd hello
linux-vdso.so.1 (0x00007ff2b5f82000)
libstd.so => /home/riri/go/pkg/linux_amd64_dynlink/libstd.so (0x00007ff2b2a00000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff2b280c000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ff2b5f54000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff2b5f84000)
Pada urutan kedua dari daftar di atas adalah dependensi libstd.so
, yang jika diperiksa maka hasilnya seperti ini:
$ ls -lah ../go/pkg/linux_amd64_dynlink/libstd.so
-rw-r--r--. 1 riri riri 37M Dec 29 17:19 ../go/pkg/linux_amd64_dynlink/libstd.so
Jadi, walaupun executable yang dihasilkan ukurannya kecil, namun dependensinya berukuran cukup besar. Semua ada plus dan minusnya. Sekian dulu tulisan singkat pada akhir pekan kali ini. Wassalam.