Untuk apa bahasa Go sangat bagus?

Selama sembilan tahun lebih di alam liar, bahasa Go Google, alias Golang — dengan versi 1.13 yang keluar pada September 2019 — telah berkembang dari rasa ingin tahu bagi para ahli alfa menjadi bahasa pemrograman yang teruji pertempuran di balik beberapa bahasa terpenting di dunia proyek cloud-centric. 

Mengapa Go dipilih oleh para pengembang proyek seperti Docker dan Kubernetes? Apa karakteristik penentu Go, apa perbedaannya dari bahasa pemrograman lain, dan jenis proyek apa yang paling cocok untuk dibuat? Dalam artikel ini, kita akan mempelajari kumpulan fitur Go, kasus penggunaan yang optimal, kelalaian dan batasan bahasa, dan kemana tujuan Go selanjutnya.

Bahasa Go kecil dan sederhana

Go, atau Golang seperti yang sering disebut, dikembangkan oleh karyawan Google — terutama guru lama Unix dan insinyur Google ternama Rob Pike — tetapi tidak secara tegas menyebut "proyek Google". Sebaliknya, Go dikembangkan sebagai proyek open source yang dipimpin oleh komunitas, dipelopori oleh kepemimpinan yang memiliki opini kuat tentang bagaimana Go harus digunakan dan arah yang harus diambil oleh bahasa tersebut.

Go dimaksudkan agar mudah dipelajari, langsung digunakan, dan mudah dibaca oleh developer lain. Go tidak memiliki set fitur yang besar, terutama jika dibandingkan dengan bahasa seperti C ++. Go mengingatkan pada C dalam sintaksnya, membuatnya relatif mudah untuk dipelajari oleh pengembang C lama. Meskipun demikian, banyak fitur Go, terutama fitur pemrograman konkurensi dan fungsionalnya, mengingatkan kembali pada bahasa seperti Erlang.

Sebagai bahasa mirip C untuk membangun dan memelihara semua jenis aplikasi perusahaan lintas platform, Go memiliki banyak kesamaan dengan Java. Dan sebagai cara untuk memungkinkan pengembangan kode yang cepat yang dapat berjalan di mana saja, Anda dapat menggambar paralel antara Go dan Python, meskipun perbedaannya jauh lebih besar daripada persamaannya.

Bahasa Go memiliki sesuatu untuk semua orang

Dokumentasi Go mendeskripsikan Go sebagai "bahasa yang cepat, diketik secara statis, dan dikompilasi yang terasa seperti bahasa yang ditafsirkan dan diketik secara dinamis." Bahkan program Go yang besar akan terkompilasi dalam hitungan detik. Selain itu, Go menghindari banyak biaya tambahan dari file dan pustaka gaya-C.

Go membuat hidup pengembang menjadi mudah dalam beberapa cara:

  • Kenyamanan.  Go telah dibandingkan dengan bahasa scripting seperti Python dalam kemampuannya untuk memenuhi banyak kebutuhan pemrograman umum. Beberapa dari fungsionalitas ini dibangun ke dalam bahasanya sendiri, seperti “goroutines” untuk perilaku konkurensi dan threadlike, sementara kemampuan tambahan tersedia dalam paket perpustakaan standar Go, seperti paket http Go. Seperti Python, Go menyediakan kemampuan manajemen memori otomatis termasuk pengumpulan sampah.

    Tidak seperti bahasa skrip seperti Python, kode Go dikompilasi ke biner asli yang berjalan cepat. Dan tidak seperti C atau C ++, Go mengkompilasi dengan sangat cepat — cukup cepat untuk membuat bekerja dengan Go terasa lebih seperti bekerja dengan bahasa scripting daripada bahasa yang dikompilasi. Lebih lanjut, sistem build Go kurang rumit dibandingkan dengan bahasa yang dikompilasi lainnya. Dibutuhkan beberapa langkah dan sedikit pembukuan untuk membangun dan menjalankan proyek Go.

  • Kecepatan.  Biner Go berjalan lebih lambat daripada rekan C mereka, tetapi perbedaan kecepatan dapat diabaikan untuk sebagian besar aplikasi. Performa Go sama baiknya dengan C untuk sebagian besar pekerjaan, dan umumnya jauh lebih cepat daripada bahasa lain yang dikenal untuk kecepatan pengembangan (misalnya, JavaScript, Python, dan Ruby).
  • Portabilitas.  Executable yang dibuat dengan toolchain Go dapat berdiri sendiri, tanpa dependensi eksternal default. Toolchain Go tersedia untuk berbagai macam sistem operasi dan platform perangkat keras, dan dapat digunakan untuk mengompilasi biner di seluruh platform.
  • Interoperabilitas.  Go memberikan semua hal di atas tanpa mengorbankan akses ke sistem yang mendasarinya. Program Go dapat berbicara dengan library C eksternal atau melakukan panggilan sistem asli. Di Docker, misalnya, Go berinteraksi dengan fungsi Linux tingkat rendah, cgroups, dan namespace, untuk menjalankan sihir kontainer.
  • Dukung.  Toolchain Go tersedia secara gratis sebagai biner Linux, MacOS, atau Windows, atau sebagai container Docker. Go disertakan secara default di banyak distribusi Linux populer, seperti Red Hat Enterprise Linux dan Fedora, membuatnya lebih mudah untuk menerapkan sumber Go ke platform tersebut. Dukungan untuk Go juga kuat di banyak lingkungan pengembangan pihak ketiga, dari Microsoft Visual Studio Code hingga Komodo IDE ActiveState.

Di mana bahasa Go bekerja paling baik

Tidak ada bahasa yang cocok untuk setiap pekerjaan, tetapi beberapa bahasa cocok untuk lebih banyak pekerjaan daripada yang lain.

Go bersinar paling terang untuk mengembangkan jenis aplikasi berikut:

  • Layanan jaringan terdistribusi. Aplikasi jaringan hidup dan mati dengan konkurensi, dan fitur konkurensi asli Go - terutama goroutine dan saluran — sangat cocok untuk pekerjaan semacam itu. Akibatnya, banyak proyek Go untuk jaringan, fungsi terdistribusi, dan layanan cloud: API, server web, kerangka kerja minimal untuk aplikasi web, dan sejenisnya.
  • Pengembangan cloud-native. Fitur jaringan dan konkurensi Go, dan tingkat portabilitasnya yang tinggi, membuatnya sangat sesuai untuk membangun aplikasi cloud-native. Faktanya, Go digunakan untuk membangun beberapa landasan komputasi cloud-native termasuk Docker, Kubernetes, dan Istio.
  • Penggantian untuk infrastruktur yang ada. Sebagian besar perangkat lunak yang kita andalkan untuk infrastruktur Internet sudah tua dan digunakan dengan eksploitasi. Menulis ulang hal-hal seperti itu di Go memberikan banyak keuntungan — keamanan memori yang lebih baik, penerapan lintas platform yang lebih mudah, dan basis kode yang bersih untuk mendorong pemeliharaan di masa mendatang. Server SSH baru yang disebut Teleport dan versi baru dari Network Time Protocol sedang ditulis di Go dan ditawarkan sebagai pengganti untuk mitra konvensional mereka.
  • Utilitas dan alat yang berdiri sendiri. Program Go dikompilasi ke binari dengan dependensi eksternal minimal. Itu membuat mereka cocok untuk membuat utilitas dan perkakas lainnya, karena mereka diluncurkan dengan cepat dan dapat segera dikemas untuk didistribusikan.

Batasi bahasa

Seperangkat fitur Go yang beropini telah menuai pujian dan kritik. Go dirancang untuk berbuat salah di sisi kecil dan mudah dipahami, dengan fitur tertentu sengaja dihilangkan. Hasilnya adalah beberapa fitur yang umum di bahasa lain tidak tersedia di Go — dengan sengaja.

Salah satu fitur tersebut adalah generik, yang memungkinkan suatu fungsi menerima berbagai jenis variabel. Go tidak termasuk obat generik, dan pengurus bahasa melarang penambahannya, dengan alasan bahwa obat generik akan mengganggu kesederhanaan bahasa. Mungkin saja untuk mengatasi batasan ini, tetapi banyak pengembang masih ingin melihat obat generik ditambahkan ke Go dengan cara tertentu. Setidaknya satu proposal untuk mengimplementasikan obat generik di Go telah diajukan, tetapi belum ada yang ditetapkan.

Kelemahan lain dari Go adalah ukuran binari yang dihasilkan. Biner Go secara statis dikompilasi secara default, artinya semua yang diperlukan saat runtime disertakan dalam gambar biner. Pendekatan ini menyederhanakan proses pembuatan dan penerapan, tetapi dengan biaya "Halo, dunia!" dengan berat sekitar 1,5MB pada Windows 64-bit. Tim Go telah bekerja untuk mengurangi ukuran biner tersebut dengan setiap rilis yang berurutan. Anda juga dapat mengecilkan binari Go dengan kompresi atau dengan menghapus informasi debug Go. Opsi terakhir ini mungkin bekerja lebih baik untuk aplikasi terdistribusi yang berdiri sendiri daripada untuk cloud atau layanan jaringan, di mana memiliki informasi debug berguna jika layanan gagal diterapkan.

Namun fitur Go yang dipuji lainnya, manajemen memori otomatis, dapat dilihat sebagai kelemahan, karena pengumpulan sampah memerlukan sejumlah overhead pemrosesan. Secara desain, Go tidak menyediakan manajemen memori manual, dan pengumpulan sampah di Go telah dikritik karena tidak menangani dengan baik jenis beban memori yang muncul di aplikasi perusahaan. Sisi positifnya, Go 1.8 menghadirkan banyak peningkatan pada manajemen memori dan pengumpulan sampah yang mengurangi jeda waktu. Tentu saja, pengembang Go memiliki kemampuan untuk menggunakan alokasi memori manual dalam ekstensi C, atau melalui pustaka manajemen memori manual pihak ketiga.

Budaya perangkat lunak seputar membangun GUI yang kaya untuk aplikasi Go, seperti yang ada di aplikasi desktop, masih tersebar.

Sebagian besar aplikasi Go adalah alat baris perintah atau layanan jaringan. Meskipun demikian, berbagai proyek sedang bekerja untuk menghadirkan GUI yang kaya untuk aplikasi Go. Ada binding untuk framework GTK dan GTK3. Proyek lain dimaksudkan untuk menyediakan UI asli platform, meskipun ini bergantung pada pengikatan C dan tidak ditulis dalam Go murni. Dan pengguna Windows dapat mencoba berjalan. Tetapi tidak ada pemenang yang jelas atau taruhan jangka panjang yang aman yang muncul di ruang ini, dan beberapa proyek, seperti upaya Google untuk membangun perpustakaan GUI lintas platform, telah berlalu. Selain itu, karena Go desainnya tidak bergantung platform, tidak mungkin salah satu dari ini akan menjadi bagian dari kumpulan paket standar.

Meskipun Go dapat berbicara dengan fungsi sistem asli, Go tidak dirancang untuk membuat komponen sistem tingkat rendah, seperti kernel atau driver perangkat, atau sistem tertanam. Bagaimanapun, runtime Go dan pengumpul sampah untuk aplikasi Go bergantung pada OS yang mendasarinya. (Pengembang yang tertarik dengan bahasa mutakhir untuk jenis pekerjaan itu mungkin melihat ke dalam bahasa Rust.)

Pergi ke masa depan bahasa

Fase berikutnya dalam pengembangan Go mungkin lebih didorong oleh keinginan dan kebutuhan basis pengembangnya, dengan pemikir Go mengubah bahasa untuk mengakomodasi audiens ini dengan lebih baik, daripada hanya memimpin dengan contoh yang keras kepala. Dengan kata lain, Go dapat memperoleh fitur yang awalnya tidak dimaksudkan untuk itu, seperti generik.

Jelas pengembang Golang menginginkan hal-hal ini. Survei pengguna Go 2018 menempatkan obat generik di antara tiga tantangan teratas dalam hal adopsi Go yang lebih luas, bersama dengan ketergantungan dan manajemen paket yang lebih baik. Dan proposal yang ada di GitHub untuk obat generik tetap aktif sebagai proposal untuk Go 2.x. Perubahan seperti ini dapat membantu Go mengambil tempat yang lebih sentral dalam pengembangan perusahaan, di mana Java, JavaScript, dan Python saat ini berkuasa.

Bahkan tanpa perubahan besar, kami dapat mengharapkan peningkatan penggunaan Go untuk proyek pembangunan kembali infrastruktur, sesuai dengan penggantian SSH dan NTP yang dijelaskan di atas, dan sebagai bagian dari proyek multi-bahasa. 

Implementasi pihak ketiga dari toolchain Go juga berkembang biak. ActiveGo dari ActiveState menyediakan edisi bahasa Go yang didukung secara komersial, dan proyek LLVM dan gccgo menyediakan implementasi Go open source berlisensi bebas melalui toolchain alternatif.

Terakhir, Go juga berfungsi sebagai basis untuk mengembangkan bahasa yang sepenuhnya baru, meskipun dua contohnya telah menghentikan pengembangan aktif. Salah satu contohnya adalah Have language, yang menyederhanakan sintaks Go, mengimplementasikan beberapa konsep yang sama dengan caranya sendiri, dan ditranslasikan ke Go untuk eksekusi yang mudah. Proyek lain yang tidak berfungsi, Oden, menggunakan assembler dan toolchain Go untuk menyusun bahasa desain baru yang mengambil inspirasi tambahan dari bahasa seperti Lisp dan Haskell.

Rangkaian proyek terakhir ini mengilustrasikan salah satu cara setiap inovasi TI menjadi benar-benar revolusioner — ketika orang membongkarnya dan menggunakannya kembali, menemukan kegunaan yang tidak pernah diinginkan oleh para perancangnya. Masa depan bahasa Go sebagai proyek yang dapat diretas baru saja dimulai. Namun masa depannya sebagai bahasa pemrograman utama sudah terjamin, tentunya di cloud, di mana kecepatan dan kesederhanaan Go memudahkan pengembangan infrastruktur yang dapat diskalakan yang dapat dipertahankan dalam jangka panjang.