Tidak ada bahasa pemrograman yang unggul di semua medan; memilih bahasa selalu berarti mencocokkan karakter bahasa dengan karakter masalah. Setelah mengenal identitas dan filosofi Go, kita perlu menimbangnya secara jujur, termasuk sisi yang jarang ditonjolkan brosur. Pada chapter ini kita petakan kekuatan Go, konsekuensi yang menyertainya, dan kondisi konkret yang membuat Go kurang cocok dipilih.

Kelebihan Utama Go #

Kekuatan Go terkonsentrasi pada hal-hal yang menentukan produktivitas tim dalam jangka panjang:

  • Binary tunggal yang mandiri. Hasil go build adalah satu file statis yang membawa runtime Go di dalamnya. Deployment menjadi sesederhana menyalin satu file; tidak ada daftar dependency yang harus dipasang di server tujuan.
  • Kompilasi cepat. Compiler gc menjaga codebase besar agar tetap terbangun dalam hitungan detik, sehingga siklus sunting-kompilasi-uji terasa hampir seperti bahasa dinamis.
  • Concurrency yang terjangkau. Sebuah goroutine hanya memakan stack awal beberapa kilobyte, jauh lebih ringan daripada thread sistem operasi. Server Go lazim melayani puluhan ribu koneksi simultan dengan model satu goroutine per koneksi.
  • Garbage collection modern. Alokasi memori dikelola otomatis dengan collector yang dirancang untuk jeda singkat, sehingga kita memperoleh kenyamanan bahasa terkelola tanpa kehilangan hasil kompilasi native.
  • Standard library siap produksi. Package seperti net/http, encoding/json, dan testing menutup sebagian besar kebutuhan server dan alat CLI tanpa pustaka pihak ketiga.
  • Tooling terpadu. Satu perintah go membungkus build, test, vet, hingga pengelolaan module; gofmt menyatukan format seluruh tim.
  • Kompatibilitas Go 1. Janji sejak 2012 bahwa program Go 1 tetap terkompilasi di versi baru menjaga umur panjang kode dan buku pegangan lama.

Kelebihan yang Selalu Membawa Konsekuensi #

Setiap keputusan desain adalah taruhan, dan keunggulan Go selalu datang bersama harga yang harus disadari sejak awal:

KelebihanKonsekuensi yang menyertainya
Binary statis mandiriUkuran file besar sejak awal — program sapaan sederhana saja menghasilkan binary berukuran beberapa megabyte karena runtime ikut terbundel
Grammar kecil dan seragamAlat abstraksi terbatas; pola yang biasa dipecahkan inheritance harus ditulis ulang dengan komposisi
Error adalah nilai biasaPenanganan galat sangat eksplisit dan repetitif — pola if err != nil muncul terus-menerus
Konversi type selalu eksplisitKode konversi bertambah dibanding bahasa yang mengonversi diam-diam
Satu gaya format resmi (gofmt)Ruang gaya personal nyaris nihil — bagi tim ini justru keuntungan

Batasan yang Perlu Dikenali #

Beberapa batasan Go bersifat struktural, bukan keterlambatan fitur yang menunggu ditambal. Batasan pertama berada di level bahasa: Go tidak menyediakan class dan inheritance, sehingga pemrograman berorientasi objek bergaya klasik — hirarki kelas dalam, abstract factory berlapis — tidak alami ditulis di Go. Penggantinya adalah komposisi struct dan interface kecil.

Go juga tidak mengenal exception: tidak ada blok try/catch, dan galat dikembalikan sebagai nilai biasa yang diperiksa pemanggilnya. Mekanisme panic/recover memang tersedia, tetapi diperuntukkan keadaan tak terpulihkan, bukan alur kerja sehari-hari. Dua penolakan kecil turut menyertai: ekspresi bersyarat tidak memiliki operator ternary sehingga ditulis dengan if/else penuh, dan generics baru tersedia sejak Go 1.18 dengan desain yang sengaja tidak sefleksibel template C++ maupun trait Rust.

Batasan berikutnya bersifat disiplin: variable dan import yang dideklarasikan tetapi tak terpakai membatalkan kompilasi. Kebijakan ini menjaga kerapian codebase, tetapi mengganggu alur eksperimen singkat di awal belajar. Batasan terakhir bersifat ekosistem: fokus utama Go berada di sisi server dan perkakas, sehingga pustaka antarmuka grafis untuk desktop, game, dan mobile UI tidak sematang milik ekosistem yang lebih lama berkecimpung di bidang tersebut.

Kapan Go Kurang Cocok #

Dari daftar di atas, kita dapat menyimpulkan kondisi konkret ketika Go layak dilewati:

  • Aplikasi desktop ber-UI kompleks atau game besar. Ekosistem Go di bidang ini belum sekuat C++/C#, Unity, atau Electron/Qt.
  • Aplikasi mobile ber-UI berat. Kotlin, Swift, dan Flutter menawarkan toolchain UI yang jauh lebih matang.
  • Riset numerik dan data science yang bergantung pustaka Python. Kematangan NumPy, Pandas, dan sekitarnya belum tertandingi di Go.
  • Tim yang berinvestasi besar pada arsitektur OOP klasik. Bila organisasi sudah memegang framework ber-basis inheritance (mis. sebagian besar ekosistem Java), biaya perpindahan pola pikir tim bisa melebihi keuntungan teknisnya.

Referensi #

Kelebihan dan batasan yang sudah kita petakan hanyalah teori sampai kita melihat Go bekerja di dunia nyata. Kabar baiknya, bukti tersebut mudah ditemukan karena beberapa perangkat lunak paling berpengaruh dekade ini justru dibangun dengan Go. Chapter berikutnya mengunjungi bidang-bidang tersebut: backend service, CLI, DevOps, hingga infrastruktur cloud.