Untuk apa bahasa Go itu bagus?

Selama sembilan tahun di alam liar, bahasa Go Google, alias Golang - dengan versi 1.13 mulai September 2019 - telah berkembang dari rasa ingin tahu untuk geeks alpha menjadi bahasa pengaturcaraan yang diuji pertempuran di sebalik beberapa yang paling penting di dunia projek berpusatkan awan. 

Mengapa Go dipilih oleh pemaju projek seperti Docker dan Kubernetes? Apa ciri menentukan Go, bagaimana ia berbeza dengan bahasa pengaturcaraan lain, dan jenis projek apa yang paling sesuai untuk dibina? Dalam artikel ini, kami akan meneroka set fitur Go, kes penggunaan optimum, kelalaian dan batasan bahasa, dan ke mana Go mungkin pergi dari sini.

Bahasa Go kecil dan sederhana

Go, atau Golang seperti yang biasa disebutnya, dikembangkan oleh pekerja Google — terutama guru Unix yang lama dan jurutera terkenal Google, Rob Pike — tetapi itu bukan “projek Google”. Sebaliknya, Go dikembangkan sebagai projek sumber terbuka yang dipimpin oleh masyarakat, dipelopori oleh kepemimpinan yang mempunyai pendapat yang kuat tentang bagaimana Go harus digunakan dan arah yang harus diambil bahasa.

Go dimaksudkan untuk mudah dipelajari, mudah digunakan, dan senang dibaca oleh pembangun lain. Go tidak mempunyai set ciri yang besar, terutama jika dibandingkan dengan bahasa seperti C ++. Go mengingatkan C dalam sintaksnya, menjadikannya agak mudah untuk dipelajari oleh pembangun C lama. Kononnya, banyak ciri Go, terutama ciri pengaturcaraan dan fungsi fungsinya, kembali kepada bahasa seperti Erlang.

Sebagai bahasa seperti C untuk membangun dan memelihara pelbagai jenis aplikasi perusahaan lintas platform, Go memiliki banyak persamaan dengan Java. Dan sebagai kaedah untuk memungkinkan pengembangan kod yang cepat yang mungkin berjalan di mana sahaja, anda boleh membuat selari antara Go dan Python, walaupun perbezaannya jauh lebih besar daripada persamaannya.

Bahasa Go mempunyai sesuatu untuk semua orang

Dokumentasi Go menggambarkan Go sebagai "bahasa yang disusun secara cepat dan dikompilasi secara statik yang terasa seperti bahasa yang ditaip dan ditafsirkan secara dinamik." Malah program Go yang besar akan disusun dalam beberapa saat. Plus, Go menghindari banyak overhead gaya C termasuk fail dan perpustakaan.

Go menjadikan kehidupan pemaju mudah dalam beberapa cara:

  • Kemudahan.  Go dibandingkan dengan bahasa skrip seperti Python dalam kemampuannya untuk memenuhi banyak keperluan pengaturcaraan biasa. Sebilangan fungsi ini dibina dalam bahasa itu sendiri, seperti "goroutine" untuk kesesuaian dan kelakuan seperti utas, sementara kemampuan tambahan tersedia dalam pakej perpustakaan standard Go, seperti pakej Go's http. Seperti Python, Go menyediakan keupayaan pengurusan memori automatik termasuk pengumpulan sampah.

    Tidak seperti bahasa skrip seperti Python, kod Go menyusun binari asli yang pantas. Dan tidak seperti C atau C ++, kompilasi Go sangat pantas — cukup pantas untuk membuat bekerja dengan Go terasa seperti bekerja dengan bahasa skrip daripada bahasa yang dikompilasi. Selanjutnya, sistem pembuatan Go kurang kompleks daripada bahasa yang disusun lain. Ia memerlukan beberapa langkah dan sedikit pembukuan untuk membina dan menjalankan projek Go.

  • Kepantasan.  Binari Go berjalan lebih perlahan daripada rakan C mereka, tetapi perbezaan kelajuan diabaikan untuk kebanyakan aplikasi. Prestasi Go sama baiknya dengan C untuk sebilangan besar pekerjaan, dan umumnya jauh lebih cepat daripada bahasa lain yang terkenal dengan kepantasan pengembangan (misalnya, JavaScript, Python, dan Ruby).
  • Kemudahalihan.  Eksekusi yang dibuat dengan rantai alat Go boleh berdiri sendiri, tanpa kebergantungan luaran lalai. Rantai alat Go tersedia untuk pelbagai sistem operasi dan platform perkakasan, dan dapat digunakan untuk menyusun binari di seluruh platform.
  • Kebolehoperasian.  Go memberikan semua perkara di atas tanpa mengorbankan akses ke sistem yang mendasari. Program Go boleh bercakap dengan perpustakaan C luaran atau membuat panggilan sistem asli. Di Docker, misalnya, pergi antara muka dengan fungsi Linux tingkat rendah, kumpulan, dan ruang nama, untuk bekerja sihir kontena.
  • Sokongan.  Rantai alat Go tersedia secara percuma sebagai perduaan Linux, MacOS, atau Windows atau sebagai wadah Docker. Go disertakan secara lalai dalam banyak distribusi Linux yang popular, seperti Red Hat Enterprise Linux dan Fedora, menjadikannya lebih mudah untuk menggunakan sumber Go ke platform tersebut. Sokongan untuk Go juga kuat di banyak persekitaran pembangunan pihak ketiga, dari Microsoft Visual Studio Code hingga ActiveState's Komodo IDE.

Bahasa Go paling sesuai

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

Go bersinar terang untuk mengembangkan jenis aplikasi berikut:

  • Perkhidmatan rangkaian yang diedarkan. Aplikasi rangkaian hidup dan mati secara serentak, dan ciri persamaan asli Go - goroutine dan saluran, terutamanya - sangat sesuai untuk pekerjaan tersebut. Akibatnya, banyak proyek Go adalah untuk rangkaian, fungsi terdistribusi, dan layanan cloud: API, pelayan web, kerangka minimum untuk aplikasi web, dan sejenisnya.
  • Pembangunan asli awan. Keistimewaan dan ciri rangkaian Go, dan tahap mudah dibawa yang tinggi, menjadikannya sangat sesuai untuk membina aplikasi asli awan. Sebenarnya, Go digunakan untuk membangun beberapa landasan pengkomputeran asli awan termasuk Docker, Kubernetes, dan Istio.
  • Penggantian infrastruktur yang ada. Sebilangan besar perisian yang kita bergantung untuk infrastruktur Internet adalah penuaan dan diperbaiki dengan eksploitasi. Menulis semula perkara seperti itu di Go memberikan banyak kelebihan — keselamatan memori yang lebih baik, penggunaan lintas platform yang lebih mudah, dan asas kod yang bersih untuk mempromosikan penyelenggaraan masa depan. Pelayan SSH baru yang disebut Teleport dan versi baru Network Time Protocol sedang ditulis dalam Go dan ditawarkan sebagai pengganti rakan-rakan konvensional mereka.
  • Utiliti dan alat yang berdiri sendiri. Program Go disusun ke binari dengan pergantungan luaran minimum. Itu menjadikan mereka sangat sesuai untuk membuat utiliti dan perkakas lain, kerana dilancarkan dengan cepat dan dapat dikemas dengan senang untuk diedarkan semula.

Batasan bahasa Go

Kumpulan ciri Go yang menarik telah menarik pujian dan kritikan. Go dirancang untuk melakukan kesalahan di sisi kecil dan mudah difahami, dengan ciri-ciri tertentu yang sengaja dihilangkan. Hasilnya adalah bahawa beberapa ciri yang biasa dalam bahasa lain tidak tersedia di Go — sengaja.

Salah satu ciri tersebut adalah generik, yang memungkinkan fungsi untuk menerima pelbagai jenis pemboleh ubah. Go tidak termasuk generik, dan penjaga bahasa menentang menambahkannya, dengan alasan generik akan menjejaskan kesederhanaan bahasa. Ada kemungkinan untuk mengatasi batasan ini, tetapi banyak pembangun masih gatal untuk melihat generik ditambahkan ke Go dengan cara tertentu. Sekurang-kurangnya satu cadangan untuk menerapkan generik di Go telah dikemukakan, tetapi tidak ada yang dibahas.

Kelemahan lain untuk Go adalah ukuran binari yang dihasilkan. Binari Go disusun secara statik secara lalai, yang bermaksud bahawa semua yang diperlukan pada waktu runtime disertakan dalam gambar binari. Pendekatan ini mempermudah proses pembuatan dan penyebaran, tetapi dengan kos "Hello, world!" beratnya sekitar 1.5MB pada Windows 64-bit. Pasukan Go telah berusaha untuk mengurangkan ukuran binari tersebut dengan setiap pelepasan berturut-turut. Anda juga boleh mengecilkan binari Go dengan mampatan atau dengan membuang maklumat debug Go. Pilihan terakhir ini mungkin berfungsi lebih baik untuk aplikasi diedarkan sendiri daripada perkhidmatan cloud atau rangkaian, di mana maklumat debug berguna jika perkhidmatan gagal di tempat.

Satu lagi ciri Go, pengurusan memori automatik, dapat dilihat sebagai kelemahan, kerana pengumpulan sampah memerlukan sejumlah besar pemprosesan. Berdasarkan reka bentuk, Go tidak menyediakan pengurusan memori manual, dan pengumpulan sampah di Go telah dikritik karena tidak berurusan dengan jenis memori yang muncul dalam aplikasi perusahaan. Di sisi positifnya, Go 1.8 membawa banyak penambahbaikan untuk pengurusan memori dan pengumpulan sampah yang mengurangkan masa jeda yang terlibat. Sudah tentu, pemaju Go mempunyai kemampuan untuk menggunakan peruntukan memori manual dalam pelanjutan C, atau dengan menggunakan perpustakaan pengurusan memori manual pihak ketiga.

Budaya perisian di sekitar membangun GUI yang kaya untuk aplikasi Go, seperti aplikasi desktop, masih tersebar.

Sebilangan besar aplikasi Go adalah alat baris perintah atau perkhidmatan rangkaian. Oleh itu, pelbagai projek sedang berusaha untuk membawa GUI yang kaya untuk aplikasi Go. Terdapat ikatan untuk kerangka GTK dan GTK3. Projek lain bertujuan untuk menyediakan UI asli platform, walaupun ini bergantung pada pengikatan C dan tidak ditulis dalam Go tulen. Dan pengguna Windows boleh mencuba berjalan kaki. Tetapi tidak ada pemenang yang jelas atau pertaruhan jangka panjang yang selamat muncul di ruang ini, dan beberapa projek, seperti percubaan Google untuk membina perpustakaan GUI lintas platform, telah berjalan di tepi jalan. Juga, kerana Go tidak bergantung pada reka bentuk platform, tidak mungkin semua ini menjadi sebahagian daripada pakej standard.

Walaupun Go dapat berbicara dengan fungsi sistem asli, itu tidak dirancang untuk membuat komponen sistem tingkat rendah, seperti kernel atau pemacu peranti, atau sistem tertanam. Bagaimanapun, runtime Go dan pengumpul sampah untuk aplikasi Go bergantung pada OS yang mendasari. (Pembangun yang berminat dengan bahasa canggih untuk jenis pekerjaan itu mungkin akan meneliti bahasa Rust.)

Pergi niaga hadapan bahasa

Fasa seterusnya dalam pengembangan Go mungkin didorong oleh kehendak dan keperluan pangkalan pembangunnya, dengan pemikir Go mengubah bahasa untuk mengakomodasi penonton ini dengan lebih baik, dan bukan hanya memimpin dengan contoh yang keras kepala. Dengan kata lain, Go mungkin memperoleh ciri-ciri yang pada asalnya tidak dimaksudkan untuknya, seperti generik.

Sudah jelas pemaju Golang mahukan perkara ini. Tinjauan pengguna Go 2018 meletakkan generik antara tiga cabaran teratas dalam cara penggunaan Go yang lebih luas, bersama dengan pergantungan dan pengurusan pakej yang lebih baik. Dan cadangan yang ada di GitHub untuk generik tetap aktif sebagai cadangan untuk Go 2.x. Perubahan seperti ini dapat membantu Go mengambil tempat yang lebih penting dalam pengembangan perusahaan, di mana Java, JavaScript, dan Python saat ini berkuasa.

Walaupun tanpa perubahan besar, kita dapat mengharapkan peningkatan penggunaan Go untuk membangun kembali infrastruktur, sesuai dengan penggantian untuk SSH dan NTP yang dijelaskan di atas, dan sebagai sebahagian daripada projek berbilang bahasa. 

Pelaksanaan pihak ketiga dari rantai alat Go juga telah berkembang. ActiveState's ActiveGo menyediakan edisi bahasa Go yang disokong secara komersial, dan kedua-dua projek LLVM dan gccgo menyediakan pelaksanaan sumber terbuka berlesen bebas dari Go melalui rantai alat alternatif.

Akhirnya, Go juga berfungsi sebagai pangkalan untuk mengembangkan bahasa yang sama sekali baru, walaupun dua contoh ini telah menghentikan perkembangan aktif. Salah satu contohnya adalah bahasa Have, yang menyederhanakan sintaks Go, menerapkan beberapa konsep yang sama dengan caranya sendiri, dan diteruskan ke Go agar mudah dilaksanakan. Projek lain yang tidak berfungsi, Oden, menggunakan assembler dan rantai alat Go untuk menyusun bahasa yang baru dirancang yang mendapat inspirasi tambahan dari bahasa seperti Lisp dan Haskell.

Kumpulan projek terakhir ini menggambarkan salah satu cara mana-mana inovasi IT menjadi benar-benar revolusioner - apabila orang membezakannya dan menggunakan semula, mencari penggunaan yang tidak pernah disengajakan oleh pereka. Masa depan bahasa Go sebagai projek yang dapat digodam baru sahaja bermula. Tetapi masa depannya sebagai bahasa pengaturcaraan utama sudah terjamin, tentu saja di awan, di mana kelajuan dan kesederhanaan Go memudahkan pengembangan infrastruktur berskala yang dapat dikekalkan dalam jangka panjang.