Go (bahasa pemrograman)
nilai, cobalah untuk mengubahnya menjadi lebih berguna melalui jenis jenis pernyataan atau jenis switch, atau periksa dengan Go codice_15 paket. Karena codice_13 dapat merujuk ke nilai apapun, itu adalah cara yang terbatas untuk melarikan diri dari batasan-batasan statis mengetik, seperti codice_17 di C tapi dengan tambahan run-time type pemeriksaan.
Antarmuka nilai-nilai yang diimplementasikan dengan menggunakan pointer ke data dan pointer ke run-time jenis informasi. Seperti beberapa jenis lain diimplementasikan dengan menggunakan pointer pada Go, antarmuka nilai-nilai codice_18 jika tidak terinisialisasi.
Dalam Kunjungan itu sistem paket, setiap paket memiliki jalan (misalnya, codice_19 atau codice_20) dan nama (misalnya, codice_21 atau codice_22). Referensi lain paket' definisi harus "selalu" menjadi diawali dengan paket lain nama, dan hanya "bermodal" nama dari paket-paket yang lain dapat diakses: codice_23codice_24 umum tapi codice_25 tidak. Perintah codice_4 dapat mengambil paket yang
disimpan dalam repositori jauh seperti GitHub, dan pengembang didorong untuk mengembangkan paket-paket di dalam basis path yang sesuai dengan sumber repositori (seperti github.com/user_name/package_name) untuk mengurangi kemungkinan tabrakan nama dengan penambahan masa depan untuk standar library atau perpustakaan eksternal.
Proposal yang ada untuk memperkenalkan tepat paket solusi manajemen untuk Go mirip dengan Karat's sistem cargo atau Node's npm sistem.
Go bahasa memiliki built-in fasilitas, serta dukungan perpustakaan, untuk menulis bersamaan program. Concurrency mengacu tidak hanya untuk CPU paralelisme, tetapi juga untuk asynchrony: membiarkan lambat operasi seperti database atau jaringan-baca dijalankan saat program melakukan pekerjaan lain, seperti yang umum dalam acara berbasis server.
Primer concurrency membangun adalah "goroutine", jenis cahaya-berat badan proses. Fungsi panggilan diawali dengan go kata kunci dimulai fungsi baru goroutine. Bahasa spesifikasi tidak menentukan bagaimana goroutines harus dilaksanakan, tetapi saat ini implementasi multipleks Go proses ini goroutines ke satu set yang lebih kecil dari sistem operasi benang, mirip dengan penjadwalan yang dilakukan dalam Erlang.
Sementara standar perpustakaan menampilkan paket yang paling klasik concurrency control struktur (mutex kunci, dll.) tersedia, idiomatik bersamaan program bukan sukai "saluran", yang memberikan mengirim pesan antara goroutines. Opsional buffer menyimpan pesan di FIFO order dan memungkinkan mengirim goroutines untuk melanjutkan sebelum mereka menerima pesan.
Saluran yang diketik, sehingga saluran dari jenis chan "T" hanya dapat digunakan untuk mentransfer pesan dari tipe "T". Sintaks khusus yang digunakan untuk beroperasi pada mereka; di bawah untuk contoh. Go memiliki memori model yang menggambarkan bagaimana goroutines harus menggunakan saluran atau operasi lainnya untuk aman berbagi data.
Keberadaan saluran set berpisah dari aktor model-gaya konkuren bahasa seperti Erlang, dimana pesan yang ditujukan langsung kepada pelaku (sesuai dengan goroutines). Aktor gaya dapat disimulasikan dalam Go dengan mempertahankan satu-ke-satu korespondensi antara goroutines dan saluran, tetapi bahasa yang memungkinkan beberapa goroutines untuk berbagi saluran atau satu goroutine untuk mengirim dan menerima pada beberapa saluran.
Dari alat-alat ini seseorang dapat membangun bersamaan konstruksi seperti pekerja outdoor, pipa (yang, katakanlah, sebuah file yang dikompres dan diurai karena popularitas), latar belakang panggilan dengan batas waktu, "fan-out" panggilan paralel untuk satu set layanan, dan lain-lain. Saluran juga telah ditemukan menggunakan lebih dari biasanya gagasan interprocess communication, seperti melayani sebagai
concurrency-daftar aman dari daur ulang buffer, pelaksana coroutines (yang membantu menginspirasi nama "goroutine"), dan menerapkan iterator.
Concurrency-struktural terkait konvensi Go (saluran dan alternatif channel input) yang berasal dari Tony Hoare yang berkomunikasi berurutan proses model. Tidak seperti sebelumnya serentak bahasa pemrograman seperti Occam atau Limbo (pekerjaan bahasa co-desainer Go Rob Pike), Go tidak menyediakan built-in gagasan aman atau diverifikasi concurrency. Sedangkan komunikasi-proses model ini disukai di Go, itu bukan hanya
satu: semua goroutines dalam program berbagi satu ruang alamat. Ini berarti bahwa mutable benda-benda dan petunjuk yang dapat dibagi antara goroutines; lihat, di bawah ini.
Meskipun Go concurrency fitur yang tidak ditujukan terutama untuk pemrosesan paralel, mereka dapat digunakan untuk program memori bersama multi-prosesor mesin. Berbagai studi telah dilakukan untuk keefektifan pendekatan ini. salah Satu studi membandingkan ukuran (dalam baris kode) dan kecepatan program yang ditulis oleh programmer berpengalaman yang tidak akrab dengan bahasa dan koreksi terhadap program-program
tersebut oleh seorang ahli (dari Google pengembangan tim), lakukan hal yang sama untuk Chapel, Cilk dan Intel TBB. Studi ini menemukan bahwa non-ahli cenderung untuk menulis membagi-dan-menaklukkan algoritme dengan satu go pernyataan per rekursi, sementara ahli menulis mendistribusikan-kerja-sinkronisasi program dengan menggunakan salah satu goroutine per prosesor. Ahli program-program yang biasanya lebih cepat, tapi juga lebih lama.
Ada tidak ada pembatasan pada bagaimana goroutines mengakses data bersama, membuat perlombaan kondisi yang mungkin. Secara khusus, kecuali program yang secara eksplisit sinkronisasi melalui saluran atau sarana lainnya, menulis dari satu goroutine mungkin sebagian, seluruhnya, atau tidak sama sekali terlihat oleh yang lain, sering dengan tidak ada
jaminan tentang pemesanan menulis. Selain itu, Go "struktur data internal" seperti antarmuka nilai-nilai, iris tajuk, tabel hash, dan string header tidak kebal terhadap kondisi ras, sehingga jenis dan memori keselamatan dapat dilanggar dalam program multithreaded yang memodifikasi berbagi contoh jenis-jenis tanpa sinkronisasi.
Bukannya dukungan bahasa, aman concurrent programming dengan demikian bergantung pada konvensi; misalnya, Chisnall merekomendasikan sebuah ungkapan yang disebut "alias xor bisa berubah", yang berarti bahwa yang lewat bisa berubah nilai (atau pointer) melalui saluran sinyal yang mentransfer kepemilikan atas nilai kepada penerima.
Go sengaja menghilangkan fitur-fitur tertentu yang umum dalam bahasa lain, termasuk (implementasi) warisan, pemrograman generik, pernyataan, pointer aritmetika, dan konversi tipe implisit.
Dari fitur bahasa ini, penulis menyampaikan keterbukaan untuk pemrograman generik, secara tegas membantah pernyataan dan pointer aritmetika, saat membela pilihan untuk menghilangkan jenis warisan sebagai pemberian yang lebih berguna bahasa, mendorong alih-alih menggunakan antarmuka untuk mencapai dinamis pengiriman dan komposisi untuk menggunakan kembali kode. Komposisi dan
delegasi yang pada kenyataannya sebagian besar otomatis oleh struct embedding; menurut peneliti Schmager "et al.", fitur ini "memiliki banyak kelemahan dari warisan: itu mempengaruhi masyarakat antarmuka dari benda-benda, tidak halus (saya.e, ada metode-tingkat kontrol atas embedding), metode tertanam benda-benda yang tidak dapat disembunyikan, dan itu adalah statis",
sehingga "tidak jelas" apakah programmer tidak akan berlebihan untuk sejauh bahwa programmer dalam bahasa lain yang terkenal berlebihan warisan.
Merujuk pada pemrograman generik, beberapa fungsi built-in "yang" pada kenyataannya jenis-generic, tapi ini diperlakukan sebagai kasus-kasus khusus; Rob Pike panggilan ini kelemahan bahasa yang mungkin di beberapa titik akan berubah. tim Google yang dirancang bahasa dibangun setidaknya satu compiler untuk eksperimental dialek Go secara umum, tapi tidak merilisnya.