Seberapa populer bahasa Go? Negara asing seperti Google, AWS, Cloudflare, CoreOS, dll., dan perusahaan domestik seperti Qiniu dan Alibaba telah mulai menggunakan bahasa Go untuk mengembangkan produk terkait komputasi awan mereka dalam skala besar. Apa Ya dan Namun yang harus saya perhatikan saat menggunakan bahasa Go? Baru-baru ini, kami menulis API menggunakan bahasa Go, bahasa pemrograman sumber terbuka yang diluncurkan oleh Google pada tahun 2009. Dalam proses menggunakan Go untuk pengembangan, kami telah mendapatkan banyak pengalaman dan pengalaman, dan kami ingin membagikannya dengan pembaca, jadi kami memiliki artikel ini.
Saat memilih bahasa pemrograman untuk sebuah proyek, kami selalu menyarankan untuk memahami apa yang akan dibangun proyek sebelum mempertimbangkan bahasa pemrograman mana yang akan dibangun. Biarkan produk menjadi faktor penentu dalam bagaimana ia harus dibangun.
Berikut adalah beberapa pro dan kontra yang kami temukan saat mengembangkan dengan Go untuk membantu Anda memahami apakah itu cocok untuk proyek Anda berikutnya.
Apa yang kami sukai dari Go
Penggunaan bahasa Go telah meledak dalam beberapa tahun terakhir. Sepertinya setiap startup menggunakannya untuk sistem backend. Ada banyak alasan di balik pengembang menganggapnya begitu populer.
Bahasa Go sangat cepat
Go adalah bahasa pemrograman yang sangat cepat. Karena Go dikompilasi ke dalam kode mesin, Go secara alami mengungguli bahasa pemrograman yang interpretatif atau memiliki runtime virtual. Program Go juga mengkompilasi dengan sangat cepat dan menghasilkan biner yang sangat kecil. API kami dikompilasi hanya dalam beberapa detik, menghasilkan file yang dapat dieksekusi sekecil 11,5MB.
Mudah dikuasai
Sintaks bahasa Go sederhana dan mudah dipahami dibandingkan dengan bahasa lain. Anda dapat menghafal sebagian besar sintaks Go di kepala Anda, yang berarti Anda tidak perlu menghabiskan banyak waktu untuk mencari sesuatu. Bahasa Go juga sangat bersih dan mudah dibaca. Programmer non-Go, terutama mereka yang terbiasa dengan sintaks gaya C, dapat membaca kode program Go dan memahami apa yang terjadi.
Bahasa definisi tipe statis
Go adalah bahasa penentu tipe statis yang kuat. Ada jenis dasar seperti int, byte, dan string. Ada juga jenis struktur. Seperti halnya bahasa yang diketik dengan kuat, sistem tipe memungkinkan kompiler untuk membantu menangkap kesalahan untuk seluruh kelas. Bahasa Go juga memiliki jenis daftar dan pemetaan bawaan, dan juga mudah digunakan.
Jenis antarmuka
Bahasa Go memiliki jenis antarmuka, dan struktur apa pun dapat dengan mudah memenuhi antarmuka dengan menerapkan antarmuka. Ini memungkinkan Anda untuk memisahkan dependensi dalam kode Anda. Anda kemudian dapat mensimulasikan dependensi dalam pengujian. Dengan menggunakan antarmuka, Anda dapat menulis kode yang lebih modular dan dapat diuji. Bahasa Go juga memiliki fungsi kelas satu, yang memungkinkan pengembang untuk menulis kode dengan cara yang lebih praktis.
Perpustakaan standar
Bahasa Go memiliki perpustakaan standar yang cukup bagus. Ini menyediakan fungsi bawaan yang nyaman untuk menangani jenis dasar. Beberapa paket memudahkan untuk membangun server web, menangani I/O, menggunakan enkripsi, dan memanipulasi byte mentah. Serialisasi dan deserialisasi JSON yang disediakan oleh pustaka standar sangat sederhana. Dengan menggunakan "tags", Anda dapat menentukan nama bidang JSON di sebelah bidang struct.
Dukungan pengujian
Dukungan pengujian dibangun ke dalam pustaka standar dan tidak memerlukan dependensi tambahan. Jika Anda memiliki file bernama thing.go, tulis tes di file lain yang disebut thing_test.go dan jalankan "go test". Go akan melakukan tes ini dengan cepat.
Alat analisis statis
Alat analisis statis untuk bahasa Go banyak dan kuat. Salah satu alat khusus adalah gofmt, yang memformat kode sesuai dengan gaya yang disarankan Go. Ini dapat menormalkan banyak pendapat proyek, memungkinkan manajer penghargaan tim untuk fokus pada pekerjaan yang telah dilakukan kode. Kami menjalankan gofmt, golint, dan vet pada setiap build, dan jika kami menemukan peringatan, build akan gagal.
Pengumpulan sampah
Saat merancang bahasa Go, manajemen memori sengaja dirancang agar lebih mudah daripada C dan C++. Objek alokasi dinamis adalah pengumpulan sampah. Bahasa Go membuat penggunaan penunjuk lebih aman karena tidak mengizinkan operasi penunjuk. Opsi untuk menggunakan jenis nilai juga disediakan.
Model konkurensi yang lebih mudah
Meskipun pemrograman bersamaan tidak pernah mudah, Go lebih mudah diprogram secara bersamaan daripada bahasa lain. Membuat utas ringan yang disebut "goroutine" dan berkomunikasi dengannya melalui "saluran" hampir merupakan tugas yang sederhana, tetapi dimungkinkan untuk model yang lebih kompleks.
Apa yang tidak kami sukai dari Go
Seperti yang kita bahas sebelumnya, Go memang bahasa yang sangat baik. Ini memiliki sintaks yang bersih dan cepat dieksekusi. Ini juga memiliki banyak keunggulan. Tetapi keseluruhan bahasa pemrograman tidak hanya mengacu pada sintaksnya. Berikut adalah beberapa masalah yang kami temui.
Tidak ada generik
Pertama, masalah ini, seperti gajah di dalam ruangan, adalah fakta yang jelas dan diabaikan. Tidak ada generik dalam bahasa Go. Bagi pengembang dari bahasa seperti Java, beralih ke Go adalah rintangan besar yang harus diatasi. Ini berarti bahwa tingkat penggunaan kembali kode berkurang. Meskipun bahasa Go memiliki fungsi kelas satu, jika Anda menulis fungsi seperti "map", "reduce", dan "filter", yang dirancang untuk beroperasi pada satu jenis koleksi, Anda tidak dapat menggunakan kembali fungsi ini untuk jenis koleksi lainnya. Ada banyak cara untuk mengatasi masalah ini, tetapi semuanya akhirnya menulis lebih banyak kode, yang mengurangi produktivitas dan pemeliharaan.
Antarmukanya implisit
Meskipun bagus untuk memiliki antarmuka, strukturnya mengimplementasikan antarmuka secara implisit daripada eksplisit. Ini dikatakan sebagai salah satu kekuatan bahasa Go, tetapi kami merasa sulit untuk mengetahui dari struktur apakah itu mengimplementasikan antarmuka atau tidak. Anda hanya dapat benar-benar memahami dengan mencoba mengkompilasi program. Jika programnya kecil, tentu tidak ada yang salah dengan itu. Tetapi jika program ini berskala menengah hingga besar, masalahnya besar.
Dukungan perpustakaan yang buruk
Dukungan perpustakaan Go tidak merata. API kami terintegrasi dengan Contentful, tetapi yang terakhir tidak memiliki Go SDK yang didukung secara resmi. Ini berarti bahwa kita harus menulis (dan memelihara!) Banyak kode untuk meminta dan mengurai data di Contentful. Kita juga harus mengandalkan pustaka Elasticsearch pihak ketiga. Go SDK yang disediakan oleh vendor tidak sepopuler rekan Java, Ruby, atau JavaScript mereka.
Komunikasi komunitas sulit
Komunitas Go mungkin tidak menerima saran. Pertimbangkan ini di repositori GitHub golint:Login hyperlink terlihat., seorang pengguna meminta agar Golint dapat gagal dalam build ketika menemukan peringatan (yang kami lakukan dalam proyek). Para pembela segera menolak gagasan tersebut. Namun, karena terlalu banyak orang mengomentari masalah ini, setelah setahun, pengelola akhirnya harus menambahkan fitur yang diminta.
Komunitas Go tampaknya juga tidak menyukai kerangka kerja web. Meskipun pustaka HTTP bahasa Go mencakup banyak aspek, perpustakaan HTTP tidak mendukung parameter jalur, pemeriksaan input, dan validasi, juga tidak mendukung masalah lintas sektoral yang umum dalam aplikasi web. Pengembang Ruby memiliki Rails, pengembang Java memiliki Spring MVC, dan pengembang Python memiliki Django. Tetapi banyak pengembang Go memilih untuk menghindari penggunaan kerangka kerja. Namun, kenyataannya tidak ada kerangka kerja, sebaliknya ada banyak. Tetapi begitu Anda mulai menggunakan kerangka kerja untuk sebuah proyek, hampir tidak mungkin untuk menghindari nasib pengabaian.
Manajemen dependensi terfragmentasi
Untuk waktu yang lama, bahasa Go tidak memiliki manajer paket yang stabil dan formal. Setelah bertahun-tahun memohon komunitas, proyek Go baru saja merilis godep. Sebelum itu, sudah banyak alat untuk mengisi kesenjangan ini. Kami menggunakan govendor yang sangat kuat dalam proyek kami, tetapi ini berarti bahwa komunitas terbagi, yang bisa sangat membingungkan bagi pengembang yang baru mengenal bahasa Go. Selain itu, hampir semua pengelola paket didukung oleh repositori Git, dan riwayat repositori Git dapat berubah sewaktu-waktu. Bandingkan dengan Maven Central, yang tidak pernah menghapus atau mengubah pustaka yang bergantung pada proyek Anda.
Memutuskan apakah akan menggunakan Go atau tidak
Terkadang, Anda perlu memikirkan mesin. Saat Anda mengirim dan menerima byte. Saat Anda mengelola ribuan proses bersamaan. Anda mungkin juga menulis sistem operasi, sistem kontainer, atau node blockchain. Dalam kasus ini, kemungkinan besar Anda tidak akan peduli dengan obat generik. Karena Anda sibuk memeras kinerja per nanodetik dari chip.
Namun, sering kali, Anda perlu memikirkan manusia. Data area bisnis yang perlu Anda kerjakan: pelanggan, karyawan, produk, pesanan. Anda perlu menulis logika bisnis yang beroperasi pada entitas domain ini, dan Anda perlu mempertahankan logika bisnis ini selama bertahun-tahun. Dan perlu berurusan dengan kebutuhan yang berubah, dan semakin cepat semakin baik. Untuk kasus ini, pengalaman pengembang itu penting.
Go adalah bahasa pemrograman yang lebih menghargai waktu mesin daripada waktu manusia. Terkadang, di bidang, kinerja mesin atau program Anda adalah yang paling penting. Dalam kasus ini, Go bisa menjadi alternatif C atau C++ yang baik. Tetapi ketika Anda menulis aplikasi n-tier yang khas, kemacetan kinerja sering muncul dalam database dan, yang lebih penting, bagaimana Anda akan memodelkan data.
Saat memutuskan apakah akan menggunakan bahasa Go, pertimbangkan aturan praktis berikut:
- Jika Anda berurusan dengan byte, maka bahasa Go mungkin merupakan pilihan yang baik.
- Jika Anda berurusan dengan data, maka bahasa Go mungkin bukan pilihan yang baik.
Ini mungkin berubah suatu hari nanti di masa depan. Bahasa dan komunitas Go masih muda. Mereka mungkin mengejutkan kita dengan penambahan obat generik; Atau kerangka web yang populer akan menang besar. Namun, untuk saat ini, kami akan tetap menggunakan bahasa pemrograman yang matang dengan dukungan universal, manajemen dependensi yang matang, dan fokus pada pemodelan domain bisnis.
|