Go (bahasa pemrograman): Perbedaan antara revisi
Impor teks terkontrol dari Wikipedia bahasa Indonesia; revisi 29515649; atribusi sumber disertakan. |
Pembersihan konten sesuai kebijakan Wiki Unissula |
||
| (1 revisi perantara oleh pengguna yang sama tidak ditampilkan) | |||
| Baris 1: | Baris 1: | ||
'''Go''' (sering disebut sebagai '''Golang''') adalah [[bahasa pemrograman]] yang dibuat di [[Google]] pada tahun 2009 oleh [[Robert Griesemer]], [[Rob Pike]], dan [[Ken Thompson]]. Go adalah bahasa pemrograman [[sumber terbuka]] yang mudah, sederhana, efisien. Selain itu, Go merupakan bahasa pemrograman yang dikompilasi, seperti [[Java]], yaitu bahasa pemrograman [[Kompilator|yang dikompilasi]] dan menggunakan [[Sintaksis|sintaks]] mirip bahasa [[C (bahasa pemrograman)|C]], dengan fitur [[Pengumpulan sampah (ilmu komputer)|pengumpulan sampah]], penulisan terstruktur, keamanan memori, dan pemrograman yang konkuren serta berurutan. [[Kompilator|Kompiler]] dan Integrated Development Environment (IDE) lainnya disediakan oleh [[Google]] dari awal secara [[Perangkat lunak bebas|bebas]] dan [[sumber terbuka]]. | [[File:Go_Logo_Blue.svg|thumb|right|280px|Go Logo Blue]] | ||
'''Go''' (sering disebut sebagai '''Golang''') adalah [[bahasa pemrograman]] yang dibuat di [[Google]]<ref>Jason Kincaid. [https://techcrunch.com/2009/11/10/google-go-language/ Google’s Go: A New Programming Language That’s Python Meets C++]. ''TechCrunch''. 10 November 2009.More than one of |work= dan |newspaper= specified (bantuan)</ref> pada tahun 2009 oleh [[Robert Griesemer]], [[Rob Pike]], dan [[Ken Thompson]].<ref>[http://golang.org/doc/go_faq.html Language Design FAQ]. ''golang.org''. 16 January 2010.</ref> Go adalah bahasa pemrograman [[sumber terbuka]] yang mudah, sederhana, efisien. Selain itu, Go merupakan bahasa pemrograman yang dikompilasi, seperti [[Java]], yaitu bahasa pemrograman [[Kompilator|yang dikompilasi]] dan menggunakan [[Sintaksis|sintaks]] mirip bahasa [[C (bahasa pemrograman)|C]], dengan fitur [[Pengumpulan sampah (ilmu komputer)|pengumpulan sampah]], penulisan terstruktur, keamanan memori, dan pemrograman yang konkuren serta berurutan.<ref>Cade Metz. [https://www.theregister.co.uk/2011/05/05/google_go/ Google Go boldly goes where no code has gone before]. ''The Register''. 5 May 2011.</ref> [[Kompilator|Kompiler]] dan Integrated Development Environment (IDE) lainnya disediakan oleh [[Google]] dari awal secara [[Perangkat lunak bebas|bebas]] dan [[sumber terbuka]].<ref>[https://golang.org/LICENSE Salinan arsip].</ref> | |||
== Sejarah == | == Sejarah == | ||
Golang pertama kali dirilis pada bulan November 2009 dan telah digunakan di lingkungan produksi oleh Google maupun perusahaan lain. | Golang pertama kali dirilis pada bulan November 2009 dan telah digunakan di lingkungan produksi oleh Google maupun perusahaan lain.<ref>[http://golang.org/doc/faq#Is_Google_using_go_internally Go FAQ: Is Google using Go internally?].</ref> | ||
Dua implementasi utama yang ada: | Dua implementasi utama yang ada: | ||
* Google Go [[Kompilator|compiler]], "gc", yang dikembangkan sebagai [[perangkat lunak sumber terbuka]]. Pihaknya menargetkan berbagai platform, termasuk [[Linux]], [[MacOS|OS X]], [[Microsoft Windows|Windows]], berbagai [[Berkeley Software Distribution|BSD]] dan [[Unix]] versi, dan juga (sejak 2015) perangkat selular (termasuk [[ponsel cerdas|ponsel pintar]]). | * Google Go [[Kompilator|compiler]], "gc", yang dikembangkan sebagai [[perangkat lunak sumber terbuka]]. Pihaknya menargetkan berbagai platform, termasuk [[Linux]], [[MacOS|OS X]], [[Microsoft Windows|Windows]], berbagai [[Berkeley Software Distribution|BSD]] dan [[Unix]] versi, dan juga (sejak 2015) perangkat selular (termasuk [[ponsel cerdas|ponsel pintar]]).<ref>[https://www.wired.com/2015/08/googles-house-programming-language-now-runs-phones/ Google's In-House Programming Language Now Runs on Phones]. ''wired.com''. 19 August 2015.</ref> | ||
* Kompiler kedua, gccgo, merupakan ''front-end'' GCC. | * Kompiler kedua, gccgo, merupakan ''front-end'' GCC.<ref>[http://golang.org/doc/go_faq.html#Implementation FAQ: Implementation]. ''golang.org''. 16 January 2010.</ref><ref>[https://gcc.gnu.org/install/configure.html Installing GCC: Configuration].</ref> | ||
"Gc" rantai alat telah ''self-hosting'' sejak versi 1.5. | "Gc" rantai alat telah ''self-hosting'' sejak versi 1.5.<ref>[https://golang.org/doc/go1.5#implementation Go 1.5 Release Notes].</ref> | ||
Go awalnya merupakan sebuah percobaan oleh para [[Rekayasawan|insinyur]] Google Robert Griesemer, Rob Pike, dan [[Ken Thompson]] untuk merancang sebuah bahasa pemrograman baru yang dapat mengatasi berbagai kritik umum terhadap bahasa lain, sambil tetap mempertahankan karakteristik positifnya. | Go awalnya merupakan sebuah percobaan oleh para [[Rekayasawan|insinyur]] Google Robert Griesemer, Rob Pike, dan [[Ken Thompson]] untuk merancang sebuah bahasa pemrograman baru yang dapat mengatasi berbagai kritik umum terhadap bahasa lain, sambil tetap mempertahankan karakteristik positifnya. | ||
Dalam pengembangannya, mereka mempertimbangkan berbagai karakteristik yang terdapat pada bahasa pemrograman lain, seperti: | Dalam pengembangannya, mereka mempertimbangkan berbagai karakteristik yang terdapat pada bahasa pemrograman lain, seperti:<ref>Rob Pike. [http://www.stanford.edu/class/ee380/Abstracts/100428.html Another Go at Language Design]. ''Stanford EE Computer Systems Colloquium''. Stanford University. 28 April 2010. [https://www.youtube.com/watch?v=7VcArS4Wpqk Video available] .</ref> | ||
* bertipe statis, skalabel untuk [[sistem]] yang besar (seperti [[Java]] dan [[C++]]) | * bertipe statis, skalabel untuk [[sistem]] yang besar (seperti [[Java]] dan [[C++]]) | ||
* produktif serta mudah dibaca tanpa memerlukan [[kata kunci]] dan pengulangan kode ("light on the page" seperti [[Bahasa pemrograman dinamis|bahasa dinamis]]) | * produktif serta mudah dibaca tanpa memerlukan [[kata kunci]] dan pengulangan kode<ref>[https://golang.org/doc/faq#different_syntax Frequently Asked Questions (FAQ) - The Go Programming Language]. ''golang.org''.</ref> ("light on the page" seperti [[Bahasa pemrograman dinamis|bahasa dinamis]]) | ||
* tidak memerlukan [[Lingkungan pengembangan terpadu|lingkungan pengembangan terintegrasi]], tetapi mendukung mereka dengan baik | * tidak memerlukan [[Lingkungan pengembangan terpadu|lingkungan pengembangan terintegrasi]], tetapi mendukung mereka dengan baik | ||
* mendukung jaringan dan ''multiprocessing'' | * mendukung jaringan dan ''multiprocessing'' | ||
Dalam wawancara terakhir, semua dari tiga perancang bahasa tidak suka terhadap kompleksitas C++ sehingga menjadi [[motivasi]] utama untuk mendesain sebuah bahasa baru. | Dalam wawancara terakhir, semua dari tiga perancang bahasa tidak suka terhadap kompleksitas C++ sehingga menjadi [[motivasi]] utama untuk mendesain sebuah bahasa baru.<ref>Andrew Binstock. [http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480 Dr. Dobb's: Interview with Ken Thompson]. 18 May 2011.</ref><ref>Rob Pike. [http://commandcenter.blogspot.mx/2012/06/less-is-exponentially-more.html Less is exponentially more]. 2012.</ref><ref>Robert Griesemer. [https://talks.golang.org/2015/gophercon-goevolution.slide#4 The Evolution of Go]. 2015.</ref> | ||
Google merilis Go 1.0 pada bulan Maret 2012. | Google merilis Go 1.0 pada bulan Maret 2012.<ref>Stephen Shankland. [https://www.cnet.com/news/googles-go-language-turns-one-wins-a-spot-at-youtube/ Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google]. CBS Interactive Inc. 2012-03-30.</ref><ref>[https://golang.org/doc/devel/release.html Release History].</ref> | ||
===Versi=== | ===Versi=== | ||
Go 1 menjamin kompatibilitas untuk spesifikasi bahasa dan bagian utama dari pustaka standar. Semua versi hingga perilisan Go 1.19 saat telah menepati janji ini | Go 1 menjamin kompatibilitas<ref>[https://golang.org/doc/go1compat Go 1 and the Future of Go Programs]. ''golang.org''.</ref> untuk spesifikasi bahasa dan bagian utama dari pustaka standar. Semua versi hingga perilisan Go 1.19 saat<ref>[https://go.dev/doc/go1.19 Go 1.19 Release Notes]. ''go.dev''.</ref> telah menepati janji ini. | ||
Setiap perilisan utama Go didukung hingga ada dua perilisan utama yang lebih baru.<ref>[https://golang.org/doc/devel/release.html#policy Release History]. ''golang.org''.</ref> | |||
{| class="wikitable sortable right" | |||
!Perilisan | |||
!Status | |||
!Tanggal perilisan | |||
!Akhir pemeliharaan | |||
|- | |||
| | |||
| | |||
| 2012-03-28 | |||
| 2013-12-01 | |||
|- | |||
| | |||
| | |||
| 2013-05-13 | |||
| 2014-06-18 | |||
|- | |||
| | |||
| | |||
| 2013-12-01 | |||
| 2014-12-10 | |||
|- | |||
| | |||
| | |||
| 2014-06-18 | |||
| 2015-08-19 | |||
|- | |||
| | |||
| | |||
| 2014-12-10 | |||
| 2016-02-17 | |||
|- | |||
| | |||
| | |||
| 2015-08-19 | |||
| 2016-08-15 | |||
|- | |||
| | |||
| | |||
| 2016-02-17 | |||
| 2017-02-16 | |||
|- | |||
| | |||
| | |||
| 2016-08-15 | |||
| 2017-08-24 | |||
|- | |||
| | |||
| | |||
| 2017-02-16 | |||
| 2018-02-16 | |||
|- | |||
| | |||
| | |||
| 2017-08-24 | |||
| 2018-08-24 | |||
|- | |||
| | |||
| | |||
| 2018-02-16 | |||
| 2019-02-25 | |||
|- | |||
| | |||
| | |||
| 2018-08-24 | |||
| 2019-09-03 | |||
|- | |||
| | |||
| | |||
| 2019-02-25 | |||
| 2020-02-25 | |||
|- | |||
| | |||
| | |||
| 2019-09-03 | |||
| 2020-08-11 | |||
|- | |||
| | |||
| | |||
| 2020-02-25 | |||
| 2021-02-16 | |||
|- | |||
| | |||
| | |||
| 2020-08-11 | |||
| 2021-08-16 | |||
|- | |||
| | |||
| | |||
| 2021-02-16 | |||
| 2022-03-15 | |||
|- | |||
| | |||
| | |||
| 2021-08-16 | |||
| 2022-08-02 | |||
|- | |||
| | |||
| | |||
| 2022-03-15 | |||
| 2022-08-02 | |||
|- | |||
| | |||
| | |||
| 2022-08-02 | |||
| 2023-02-01 | |||
|- | |||
| | |||
| | |||
| 2023-02-01 | |||
| 2024-02-06 | |||
|- | |||
| | |||
| | |||
|2023-08-08 | |||
|2024-08-13 | |||
|- | |||
| | |||
| | |||
|2024-02-06 | |||
|2025-02-11 | |||
|- | |||
| | |||
| | |||
|2024-08-13 | |||
|Q3 2025 | |||
|- | |||
| | |||
| | |||
|2025-02-11 | |||
|Q1 2026 | |||
|- | |||
| | |||
| | |||
|Q3 2025 | |||
|Q3 2026 | |||
|- | |||
| colspan="4" | | |||
|} | |||
== Desain bahasa == | == Desain bahasa == | ||
Go lebih dikenal sebagai bagian dari tradisi [[C (bahasa pemrograman)|C]], namun menghadirkan banyak perubahan untuk meningkatkan efisiensi, kesederhanaan, dan keamanan. Go terdiri dari: | Go lebih dikenal sebagai bagian dari tradisi [[C (bahasa pemrograman)|C]], namun menghadirkan banyak perubahan untuk meningkatkan efisiensi, kesederhanaan, dan keamanan. Go terdiri dari: | ||
* Sintaks dan lingkungan mengadopsi pola-pola yang lebih umum dalam [[Bahasa pemrograman dinamis|bahasa dinamis]]: | * Sintaks dan lingkungan mengadopsi pola-pola yang lebih umum dalam [[Bahasa pemrograman dinamis|bahasa dinamis]]:<ref>Rob Pike. [https://www.youtube.com/watch?v=rKnDgT73v8s&feature=related The Go Programming Language]. YouTube.</ref> | ||
** Opsional ringkas variabel deklarasi dan inisialisasi melalui jenis inferensi (<code>x := 0</code> tidak <code>int x = 0;</code> atau <code>var x = 0;</code>). | ** Opsional ringkas variabel deklarasi dan inisialisasi melalui jenis inferensi (<code>x := 0</code> tidak <code>int x = 0;</code> atau <code>var x = 0;</code>). | ||
** Kompilasi cepat. | ** Kompilasi cepat.<ref>[https://id.wikipedia.org/w/index.php?title=Go+%28bahasa+pemrograman%29&oldid=29515649 sumber pada Wikipedia bahasa Indonesia]</ref> | ||
** Manajemen paket jarak jauh (<code>go get</code>) dan paket dokumentasi daring. | ** Manajemen paket jarak jauh (<code>go get</code>)<ref>[http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies Download and install packages and dependencies - go - The Go Programming Language] ; see [http://godoc.org godoc.org] for addresses and documentation of some packages</ref> dan paket dokumentasi daring.<ref>[http://godoc.org/ GoDoc]. ''godoc.org''.</ref> | ||
* Khas pendekatan untuk masalah tertentu: | * Khas pendekatan untuk masalah tertentu: | ||
** Fasilitas konkruensi bawaan: proses ringan (''lightweight process''), saluran, dan yang <code>memilih</code> pernyataan. | ** Fasilitas konkruensi bawaan: proses ringan (''lightweight process''), saluran, dan yang <code>memilih</code> pernyataan. | ||
** Sebuah antarmuka sistem di tempat virtual warisan, dan jenis ''embedding'' bukan non-virtual warisan. | ** Sebuah antarmuka sistem di tempat virtual warisan, dan jenis ''embedding'' bukan non-virtual warisan. | ||
** Sebuah toolchain yang, secara ''default'', menghasilkan biner asli yang ditautkan secara statis tanpa dependensi eksternal. | ** Sebuah toolchain yang, secara ''default'', menghasilkan biner asli yang ditautkan secara statis tanpa dependensi eksternal. | ||
* Spesifikasi bahasa dirancang agar cukup sederhana sehingga dapat dipahami secara menyeluruh oleh seorang [[Pemrogram|''programmer'']], di bagian dengan menghilangkan fitur-fitur umum untuk bahasa yang sama. | * Spesifikasi bahasa dirancang agar cukup sederhana sehingga dapat dipahami secara menyeluruh oleh seorang [[Pemrogram|''programmer'']],<ref>Rob Pike, on [http://5by5.tv/changelog/100 The Changelog] podcast</ref> di bagian dengan menghilangkan fitur-fitur umum untuk bahasa yang sama. | ||
=== Sintaks === | === Sintaks === | ||
| Baris 42: | Baris 181: | ||
=== Jenis (Tipe Data) === | === Jenis (Tipe Data) === | ||
Go memiliki sejumlah [[tipe data]] bawaan yang ditanamkan, termasuk numerik (byte, int64, float32, dll.), [[Aljabar Boole|boolean]], dan [[string]] karakter (string). String yang berubah; built-in operator dan kata kunci (bukan fungsi) memberikan rangkaian, perbandingan, dan [[UTF-8]] encoding dan decoding. [[Record|jenis Catatan]] dapat didefinisikan dengan kata kunci struct. | Go memiliki sejumlah [[tipe data]] bawaan yang ditanamkan, termasuk numerik (byte, int64, float32, dll.), [[Aljabar Boole|boolean]], dan [[string]] karakter (string). String yang berubah; built-in operator dan kata kunci (bukan fungsi) memberikan rangkaian, perbandingan, dan [[UTF-8]] encoding dan decoding.<ref>Rob Pike, [http://blog.golang.org/strings Strings, bytes, runes and characters in Go] , 23 October 2013</ref> [[Record|jenis Catatan]] dapat didefinisikan dengan kata kunci struct. | ||
Untuk masing-masing tipe ''T'' dan setiap non-negatif konstanta integer ''n'', ada sebuah [[Larik|array]] jenis dilambangkan [''n'']''T''; [[Larik|array]] yang berbeda-beda panjangnya sehingga dari jenis yang berbeda. [[Larik|Array]] dinamis yang tersedia sebagai "iris", dilambangkan []''T'' untuk beberapa jenis ''T''. Ini memiliki panjang dan ''kapasitas'' menentukan ketika baru memori yang harus dialokasikan untuk memperluas [[Larik|array]]. Beberapa irisan dapat berbagi mereka mendasari memori. | Untuk masing-masing tipe ''T'' dan setiap non-negatif konstanta integer ''n'', ada sebuah [[Larik|array]] jenis dilambangkan [''n'']''T''; [[Larik|array]] yang berbeda-beda panjangnya sehingga dari jenis yang berbeda. [[Larik|Array]] dinamis yang tersedia sebagai "iris", dilambangkan []''T'' untuk beberapa jenis ''T''. Ini memiliki panjang dan ''kapasitas'' menentukan ketika baru memori yang harus dialokasikan untuk memperluas [[Larik|array]]. Beberapa irisan dapat berbagi mereka mendasari memori.<ref>Andrew Gerrand, [http://blog.golang.org/go-slices-usage-and-internals Go Slices: usage and internals]</ref><ref>The Go Authors, [http://golang.org/doc/effective_go.html#slices Effective Go: Slices]</ref> | ||
Petunjuk tersedia untuk semua type, dan inter-ke-''T'' jenis dilambangkan *''T''. Alamat-mengambil dan tipuan gunakan & dan * operator di C, atau terjadi secara implisit melalui metode panggilan atau atribut akses sintaks. tidak Ada [[Penunjuk (ilmu komputer)|pointer]] aritmetika, kecuali melalui khusus jenis unsafe.[[Penunjuk (ilmu komputer)|Pointer]] di perpustakaan standar. | Petunjuk tersedia untuk semua type, dan inter-ke-''T'' jenis dilambangkan *''T''. Alamat-mengambil dan tipuan gunakan & dan * operator di C, atau terjadi secara implisit melalui metode panggilan atau atribut akses sintaks.<ref>The Go authors [https://golang.org/ref/spec#Selectors Selectors - The Go Programming Language Specification] and [https://golang.org/ref/spec#Calls Calls - The Go Programming Language Specification]</ref> tidak Ada [[Penunjuk (ilmu komputer)|pointer]] aritmetika, kecuali melalui khusus jenis unsafe.[[Penunjuk (ilmu komputer)|Pointer]] di perpustakaan standar. | ||
Untuk pasangan dari jenis ''K'', ''V'', jenis map[''K'']''V'' adalah jenis [[tabel hash]] memetakan tipe-''K'' kunci untuk tipe-''V'' nilai-nilai. Tabel Hash yang dibangun ke dalam bahasa, dengan sintaks khusus dan built-in fungsi. chan ''T'' adalah ''saluran'' yang memungkinkan pengiriman nilai-nilai dari tipe ''T'' antara bersamaan Go proses. | Untuk pasangan dari jenis ''K'', ''V'', jenis map[''K'']''V'' adalah jenis [[tabel hash]] memetakan tipe-''K'' kunci untuk tipe-''V'' nilai-nilai. Tabel Hash yang dibangun ke dalam bahasa, dengan sintaks khusus dan built-in fungsi. chan ''T'' adalah ''saluran'' yang memungkinkan pengiriman nilai-nilai dari tipe ''T'' antara bersamaan Go proses. | ||
Selain dukungan untuk [[Go (programming language)#Interfaces|antarmuka]], Go tipe sistem adalah nominal: type kata kunci yang dapat digunakan untuk mendefinisikan baru ''bernama jenis'', yang berbeda dari lainnya bernama jenis yang memiliki letak yang sama (dalam kasus sebuah struct, anggota yang sama dalam urutan yang sama). Beberapa konversi antara jenis (misalnya, antara berbagai tipe [[Integer (ilmu komputer)|integer]]) pra-didefinisikan dan menambahkan jenis baru dapat menentukan konversi tambahan, tapi konversi antara nama jenis harus selalu dipanggil secara eksplisit. sebagai contoh, type kata kunci yang dapat digunakan untuk mendefinisikan tipe untuk [[Alamat IP versi 4|IPv4]] alamat, yang adalah 32-bit unsigned integer. | Selain dukungan untuk [[Go (programming language)#Interfaces|antarmuka]], Go tipe sistem adalah nominal: type kata kunci yang dapat digunakan untuk mendefinisikan baru ''bernama jenis'', yang berbeda dari lainnya bernama jenis yang memiliki letak yang sama (dalam kasus sebuah struct, anggota yang sama dalam urutan yang sama). Beberapa konversi antara jenis (misalnya, antara berbagai tipe [[Integer (ilmu komputer)|integer]]) pra-didefinisikan dan menambahkan jenis baru dapat menentukan konversi tambahan, tapi konversi antara nama jenis harus selalu dipanggil secara eksplisit.<ref>[http://golang.org/ref/spec#Assignability The Go Programming Language Specification]. ''golang.org''.</ref> sebagai contoh, type kata kunci yang dapat digunakan untuk mendefinisikan tipe untuk [[Alamat IP versi 4|IPv4]] alamat, yang adalah 32-bit unsigned integer. | ||
Dengan jenis definisi tersebut, ipv4addr(x) menafsirkan uint32 nilai x sebagai [[alamat IP]]. Menginisiasialisasi variabel bertipe ipv4addr menggunakan nilai yang tidak sesuai akan menghasilkan kesalahan tipe. | Dengan jenis definisi tersebut, ipv4addr(x) menafsirkan uint32 nilai x sebagai [[alamat IP]]. Menginisiasialisasi variabel bertipe ipv4addr menggunakan nilai yang tidak sesuai akan menghasilkan kesalahan tipe. | ||
Ekspresi konstan dapat berupa diketik atau "untyped"; mereka diberi jenis ketika ditugaskan untuk mengetik variabel jika nilai mereka mewakili melewati waktu kompilasi cek. | Ekspresi konstan dapat berupa diketik atau "untyped"; mereka diberi jenis ketika ditugaskan untuk mengetik variabel jika nilai mereka mewakili melewati waktu kompilasi cek.<ref>[http://golang.org/ref/spec#Constants The Go Programming Language Specification]. ''golang.org''.</ref> | ||
[[Subrutin|Fungsi]] jenis ini adalah yang ditunjukkan oleh func kata kunci; mereka mengambil nol atau lebih parameter dan kembali nol atau lebih nilai-nilai yang diketik. Parameter dan mengembalikan nilai-nilai menentukan tipe fungsi; dengan demikian, func (string, int32) (int, error) adalah jenis fungsi yang mengambil string dan 32-bit signed integer, dan menandatangani sebuah integer (default lebar) dan nilai built-in antarmuka jenis error. | [[Subrutin|Fungsi]] jenis ini adalah yang ditunjukkan oleh func kata kunci; mereka mengambil nol atau lebih parameter dan kembali nol atau lebih nilai-nilai yang diketik. Parameter dan mengembalikan nilai-nilai menentukan tipe fungsi; dengan demikian, func (string, int32) (int, error) adalah jenis fungsi yang mengambil string dan 32-bit signed integer, dan menandatangani sebuah integer (default lebar) dan nilai built-in antarmuka jenis error. | ||
Setiap nama memiliki metode yang ditetapkan terkait dengan itu. Alamat IP contoh di atas dapat diperpanjang dengan sebuah metode untuk memeriksa apakah nilai adalah standar yang dikenal. Karena mengetik nominal, definisi metode ini menambah sebuah method ke ipv4addr, tetapi tidak pada uint32. Sedangkan method memiliki definisi khusus dan memanggil sintaks, tidak ada method yang berbeda jenis. | Setiap nama memiliki metode yang ditetapkan terkait dengan itu. Alamat IP contoh di atas dapat diperpanjang dengan sebuah metode untuk memeriksa apakah nilai adalah standar yang dikenal. Karena mengetik nominal, definisi metode ini menambah sebuah method ke ipv4addr, tetapi tidak pada uint32. Sedangkan method memiliki definisi khusus dan memanggil sintaks, tidak ada method yang berbeda jenis.<ref>[http://golang.org/ref/spec#Calls The Go Programming Language Specification]. ''golang.org''.</ref> | ||
==== Sistem antarmuka ==== | ==== Sistem antarmuka ==== | ||
Go menyediakan dua fitur yang menggantikan kelas warisan. | Go menyediakan dua fitur yang menggantikan kelas warisan. | ||
Yang pertama adalah ''embedding'', yang dapat dilihat sebagai bentuk otomatis dari komposisi atau delegasi.<sup>:255</sup> | Yang pertama adalah ''embedding'', yang dapat dilihat sebagai bentuk otomatis dari komposisi atau delegasi.<ref>Mark Summerfield. ''Programming in Go: Creating Applications for the 21st Century''. Addison-Wesley. 2012.</ref><sup>:255</sup> | ||
Sebuah antarmuka menentukan satu set jenis dengan daftar yang diperlukan metode dan jenis mereka dan puas dengan setiap jenis yang memiliki metode yang diperlukan. Pelaksana jenis yang tidak perlu menentukan mereka mengimplementasikan interface, jadi jika Shape, Square dan Circle didefinisikan sebagai: Kedua Square dan Circle yang secara implisit Shape dan dapat ditugaskan untuk Shape-diketik variabel.<sup>:263–268</sup> Dalam [[bahasa formal]], antarmuka Go sistem menyediakan struktural daripada nominal mengetik. Interface dapat menanamkan antarmuka lain dengan efek menciptakan gabungan antarmuka yang puas dengan tepat jenis yang menerapkan tertanam antarmuka dan metode-metode yang baru yang didefinisikan antarmuka menambahkan.<sup>:270</sup> | Sebuah antarmuka menentukan satu set jenis dengan daftar yang diperlukan metode dan jenis mereka dan puas dengan setiap jenis yang memiliki metode yang diperlukan. Pelaksana jenis yang tidak perlu menentukan mereka mengimplementasikan interface, jadi jika Shape, Square dan Circle didefinisikan sebagai: Kedua Square dan Circle yang secara implisit Shape dan dapat ditugaskan untuk Shape-diketik variabel.<sup>:263–268</sup> Dalam [[bahasa formal]], antarmuka Go sistem menyediakan struktural daripada nominal mengetik. Interface dapat menanamkan antarmuka lain dengan efek menciptakan gabungan antarmuka yang puas dengan tepat jenis yang menerapkan tertanam antarmuka dan metode-metode yang baru yang didefinisikan antarmuka menambahkan.<sup>:270</sup> | ||
| Baris 71: | Baris 209: | ||
Go standar perpustakaan menggunakan antarmuka untuk memberikan genericity di beberapa tempat, termasuk sistem input/output yang didasarkan pada konsep-konsep dari Reader dan Writer.<sup>:282–283</sup> | Go standar perpustakaan menggunakan antarmuka untuk memberikan genericity di beberapa tempat, termasuk sistem input/output yang didasarkan pada konsep-konsep dari Reader dan Writer.<sup>:282–283</sup> | ||
Selain memanggil metode melalui antarmuka, Go memungkinkan mengubah antarmuka nilai-nilai untuk jenis lain dengan run-time type check. Bahasa konstruksi untuk melakukannya adalah ''jenis pernyataan'', yang memeriksa terhadap satu potensi jenis, dan ''jenis switch'', yang memeriksa terhadap beberapa jenis. | Selain memanggil metode melalui antarmuka, Go memungkinkan mengubah antarmuka nilai-nilai untuk jenis lain dengan run-time type check. Bahasa konstruksi untuk melakukannya adalah ''jenis pernyataan'',<ref>[http://golang.org/ref/spec#Type_assertions The Go Programming Language Specification]. ''golang.org''.</ref> yang memeriksa terhadap satu potensi jenis, dan ''jenis switch'',<ref>[http://golang.org/ref/spec#Type_switches The Go Programming Language Specification]. ''golang.org''.</ref> yang memeriksa terhadap beberapa jenis. | ||
Yang ''kosong antarmuka'' <code>interface{}</code> adalah sudut yang penting kasus ini karena hal ini dapat merujuk ke item dari ''setiap'' jenis beton. Hal ini mirip dengan Object class dalam [[Java]] atau [[C sharp|C#]] dan puas dengan jenis apa pun, termasuk built-in jenis seperti int.<sup>:284</sup> Kode menggunakan kosong interface tidak hanya memanggil metode (atau built-in operator) yang disebut-objek, tetapi dapat menyimpan <code>interface{}</code> nilai, cobalah untuk mengubahnya menjadi lebih berguna melalui jenis jenis pernyataan atau jenis switch, atau periksa dengan Go <code>mencerminkan</code> paket. Karena <code>interface{}</code> dapat merujuk ke nilai apapun, itu adalah cara yang terbatas untuk melarikan diri dari batasan-batasan statis mengetik, seperti <code>void*</code> di C tapi dengan tambahan run-time type pemeriksaan. | Yang ''kosong antarmuka'' <code>interface{}</code> adalah sudut yang penting kasus ini karena hal ini dapat merujuk ke item dari ''setiap'' jenis beton. Hal ini mirip dengan Object class dalam [[Java]] atau [[C sharp|C#]] dan puas dengan jenis apa pun, termasuk built-in jenis seperti int.<sup>:284</sup> Kode menggunakan kosong interface tidak hanya memanggil metode (atau built-in operator) yang disebut-objek, tetapi dapat menyimpan <code>interface{}</code> nilai, cobalah untuk mengubahnya menjadi lebih berguna melalui jenis jenis pernyataan atau jenis switch, atau periksa dengan Go <code>mencerminkan</code> paket.<ref>[http://golang.org/pkg/reflect/#ValueOf reflect.ValueOf(i interface{})] converts an interface{} to a reflect.Value that can be further inspected</ref> Karena <code>interface{}</code> dapat merujuk ke nilai apapun, itu adalah cara yang terbatas untuk melarikan diri dari batasan-batasan statis mengetik, seperti <code>void*</code> di C tapi dengan tambahan run-time type pemeriksaan. | ||
Antarmuka nilai-nilai yang diimplementasikan dengan menggunakan [[Penunjuk (ilmu komputer)|pointer]] ke data dan [[Penunjuk (ilmu komputer)|pointer]] ke run-time jenis informasi. Seperti beberapa jenis lain diimplementasikan dengan menggunakan pointer pada Go, antarmuka nilai-nilai <code>nihil</code> jika tidak terinisialisasi. | Antarmuka nilai-nilai yang diimplementasikan dengan menggunakan [[Penunjuk (ilmu komputer)|pointer]] ke data dan [[Penunjuk (ilmu komputer)|pointer]] ke run-time jenis informasi.<ref>[http://research.swtch.com/interfaces Go Data Structures: Interfaces].</ref> Seperti beberapa jenis lain diimplementasikan dengan menggunakan pointer pada Go, antarmuka nilai-nilai <code>nihil</code> jika tidak terinisialisasi.<ref>[http://golang.org/ref/spec#Interface_types The Go Programming Language Specification]. ''golang.org''.</ref> | ||
=== Sistem paket === | === Sistem paket === | ||
Dalam sistem paket go, setiap paket memiliki pola (misalnya, <code>"compress/bzip2"</code> atau <code>"golang.org/x/net/html"</code>) dan nama (misalnya, <code>bzip2</code> atau <code>html</code>). Secara default, definisi dari paket lain harus selalu diawali dengan nama paket lain tersebut, dan hanya paket dengan nama diawali kapital yang bisa diakses di paket lain: <code>io.Reader</code> umum tapi <code>bzip2.reader</code> tidak. Perintah <code>go get</code> 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. | Dalam sistem paket go, setiap paket memiliki pola (misalnya, <code>"compress/bzip2"</code> atau <code>"golang.org/x/net/html"</code>) dan nama (misalnya, <code>bzip2</code> atau <code>html</code>). Secara default, definisi dari paket lain harus selalu diawali dengan nama paket lain tersebut, dan hanya paket dengan nama diawali kapital yang bisa diakses di paket lain: <code>io.Reader</code> umum tapi <code>bzip2.reader</code> tidak.<ref>[http://golang.org/doc/go_tutorial.html A Tutorial for the Go Programming Language]. ''The Go Programming Language''. Google.</ref> Perintah <code>go get</code> dapat mengambil paket yang disimpan dalam repositori jauh seperti [[GitHub]],<ref>[http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies go - The Go Programming Language]. ''golang.org''.</ref> 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.<ref>[https://golang.org/doc/code.html How to Write Go Code]. ''golang.org''.</ref> | ||
Proposal yang ada untuk memperkenalkan tepat paket solusi manajemen untuk Go mirip dengan [[Rust (bahasa pemrograman)|Karat]]'s sistem cargo atau [[Node.js|Node]]'s npm sistem. | Proposal yang ada untuk memperkenalkan tepat paket solusi manajemen untuk Go mirip dengan [[Rust (bahasa pemrograman)|Karat]]'s sistem cargo atau [[Node.js|Node]]'s npm sistem.<ref>[https://docs.google.com/document/d/18tNd8r5DV0yluCR7tPvkMTsWD_lYcRO7NhpNSDymRr8/edit?pref=2&pli=1 Go Packaging Proposal Process].</ref> | ||
=== Concurrency: goroutines dan channel === | === Concurrency: goroutines dan channel === | ||
Bahasa go memiliki built-in fasilitas, serta dukungan perpustakaan, untuk menulis program yang konkuren. Konkurensi mengacu tidak hanya untuk pararelisme CPU , tetapi juga untuk asynchrony: membiarkan operasi lambat seperti database atau jaringan dijalankan saat program melakukan pekerjaan lain, seperti yang umum dalam program server. | Bahasa go memiliki built-in fasilitas, serta dukungan perpustakaan, untuk menulis program yang konkuren. Konkurensi mengacu tidak hanya untuk pararelisme CPU , tetapi juga untuk asynchrony: membiarkan operasi lambat seperti database atau jaringan dijalankan saat program melakukan pekerjaan lain, seperti yang umum dalam program server.<ref>Rob Pike, [http://vimeo.com/49718712 Concurrency is not Parallelism]</ref> | ||
Model konkurensi primer go adalah ''goroutine'', suatu jenis green threads. Suatu fungsi yang dipanggil dengan kata kunci go akan memulai fungsi tersebut di goroutine baru. Bahasa spesifikasi tidak menentukan bagaimana goroutines harus dilaksanakan, tetapi saat ini implementasi multipleks Go proses ini goroutines ke satu set yang lebih kecil dari [[Utas (komputer)|sistem operasi benang]], mirip dengan penjadwalan yang dilakukan dalam Erlang.<sup>:10</sup> | Model konkurensi primer go adalah ''goroutine'', suatu jenis green threads. Suatu fungsi yang dipanggil dengan kata kunci go akan memulai fungsi tersebut di goroutine baru. Bahasa spesifikasi tidak menentukan bagaimana goroutines harus dilaksanakan, tetapi saat ini implementasi multipleks Go proses ini goroutines ke satu set yang lebih kecil dari [[Utas (komputer)|sistem operasi benang]], mirip dengan penjadwalan yang dilakukan dalam Erlang.<sup>:10</sup> | ||
Sementara standar perpustakaan menampilkan paket yang paling klasik concurrency control struktur (mutex kunci, dll.) tersedia,<sup>:151–152</sup> idiomatik bersamaan program bukan sukai ''saluran'', yang memberikan mengirim pesan antara goroutines. Opsional buffer menyimpan pesan di [[FIFO]] order<sup>:43</sup> dan memungkinkan mengirim goroutines untuk melanjutkan sebelum mereka menerima pesan. | Sementara standar perpustakaan menampilkan paket yang paling klasik concurrency control struktur (mutex kunci, dll.) tersedia,<sup>:151–152</sup> idiomatik bersamaan program bukan sukai ''saluran'', yang memberikan mengirim pesan antara goroutines.<ref>[http://golang.org/doc/effective_go.html#sharing Effective Go]. ''golang.org''.</ref> Opsional buffer menyimpan pesan di [[FIFO]] order<sup>:43</sup> 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; <-ch adalah ekspresi yang menyebabkan melaksanakan goroutine untuk memblokir sampai nilai datang di channel ch, sedangkan ch <- x mengirimkan nilai x (mungkin memblokir sampai lain goroutine menerima nilai). Built-in switch-suka select pernyataan yang dapat digunakan untuk mengimplementasikan non-blocking komunikasi pada beberapa saluran; lihat [[Go (programming language)#Concurrency example|di bawah]] untuk contoh. Go memiliki memori model yang menggambarkan bagaimana goroutines harus menggunakan saluran atau operasi lainnya untuk aman berbagi data. | 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; <-ch adalah ekspresi yang menyebabkan melaksanakan goroutine untuk memblokir sampai nilai datang di channel ch, sedangkan ch <- x mengirimkan nilai x (mungkin memblokir sampai lain goroutine menerima nilai). Built-in switch-suka select pernyataan yang dapat digunakan untuk mengimplementasikan non-blocking komunikasi pada beberapa saluran; lihat [[Go (programming language)#Concurrency example|di bawah]] untuk contoh. Go memiliki memori model yang menggambarkan bagaimana goroutines harus menggunakan saluran atau operasi lainnya untuk aman berbagi data.<ref>[http://golang.org/ref/mem The Go Memory Model].</ref> | ||
Keberadaan saluran set berpisah dari aktor model-gaya konkuren bahasa seperti Erlang, di mana 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.<sup>:147</sup> | Keberadaan saluran set berpisah dari aktor model-gaya konkuren bahasa seperti Erlang, di mana 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.<sup>:147</sup> | ||
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. | 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.<ref>[http://talks.golang.org/2012/concurrency.slide Go Concurrency Patterns]. ''golang.org''.</ref> Saluran juga telah ditemukan menggunakan lebih dari biasanya gagasan interprocess communication, seperti melayani sebagai concurrency-daftar aman dari daur ulang buffer,<ref>John Graham-Cumming, [http://blog.cloudflare.com/recycling-memory-buffers-in-go Recycling Memory Buffers in Go]</ref> pelaksana coroutines (yang membantu menginspirasi nama ''goroutine''),<ref>[http://golang.org/doc/play/tree.go tree.go].</ref> dan menerapkan iterator.<ref>Ewen Cheslack-Postava, [http://ewencp.org/blog/golang-iterators/ Iterators in Go]</ref> | ||
Konvensi struktural terkait konkurensi dari Go (saluran dan alternatif channel input) yang berasal dari [[C.A.R. Hoare|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. | Konvensi struktural terkait konkurensi dari Go (saluran dan alternatif channel input) yang berasal dari [[C.A.R. Hoare|Tony Hoare yang]] berkomunikasi berurutan proses model. Tidak seperti sebelumnya serentak bahasa pemrograman seperti Occam atau Limbo (pekerjaan bahasa co-desainer Go Rob Pike ),<ref>Brian W. Kernighan, [http://www.vitanuova.com/inferno/papers/descent.html A Descent Into Limbo]</ref> Go tidak menyediakan built-in gagasan aman atau diverifikasi concurrency.<ref>[http://golang.org/doc/go_mem.html The Go Memory Model]. Google.</ref> 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. | ||
==== Kesesuaian untuk pemrograman paralel ==== | ==== Kesesuaian untuk pemrograman paralel ==== | ||
Meskipun ''Go concurrency'' fitur yang tidak ditujukan terutama untuk [[Komputasi paralel|pemrosesan paralel]], mereka dapat digunakan untuk program memori bersama [[Multipengolahan|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 [[Algoritma|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. | Meskipun ''Go concurrency'' fitur yang tidak ditujukan terutama untuk [[Komputasi paralel|pemrosesan paralel]], mereka dapat digunakan untuk program memori bersama [[Multipengolahan|multi-prosesor]] mesin. Berbagai studi telah dilakukan untuk keefektifan pendekatan ini.<ref>[https://id.wikipedia.org/w/index.php?title=Go+%28bahasa+pemrograman%29&oldid=29515649 sumber pada Wikipedia bahasa Indonesia]</ref> 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 [[Algoritma|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.<ref>[https://id.wikipedia.org/w/index.php?title=Go+%28bahasa+pemrograman%29&oldid=29515649 sumber pada Wikipedia bahasa Indonesia]</ref> | ||
==== Kurangnya kondisi balapan keselamatan ==== | ==== Kurangnya kondisi balapan keselamatan ==== | ||
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. | 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.<ref>Russ Cox, [http://research.swtch.com/gorace Off to the Races]</ref><ref>Rob Pike. [http://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Software Engineering]. Google, Inc. October 25, 2012. "There is one important caveat: Go is not purely memory safe in the presence of concurrency."</ref> | ||
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 [[Penunjuk (ilmu komputer)|pointer]]) melalui saluran sinyal yang mentransfer kepemilikan atas nilai kepada penerima.<sup>:155</sup> | 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 [[Penunjuk (ilmu komputer)|pointer]]) melalui saluran sinyal yang mentransfer kepemilikan atas nilai kepada penerima.<sup>:155</sup> | ||
| Baris 108: | Baris 246: | ||
Go sengaja menghilangkan fitur-fitur tertentu yang umum dalam bahasa lain, termasuk (implementasi) warisan, pemrograman generik, pernyataan, [[Penunjuk (ilmu komputer)|pointer]] aritmetika, dan konversi tipe implisit. | Go sengaja menghilangkan fitur-fitur tertentu yang umum dalam bahasa lain, termasuk (implementasi) warisan, pemrograman generik, pernyataan, [[Penunjuk (ilmu komputer)|pointer]] aritmetika, dan konversi tipe implisit. | ||
Dari fitur bahasa ini, penulis menyampaikan keterbukaan untuk pemrograman generik, secara tegas membantah pernyataan dan [[Penunjuk (ilmu komputer)|pointer]]<nowiki> aritmetika, saat membela pilihan untuk menghilangkan jenis warisan sebagai pemberian yang lebih berguna bahasa, mendorong alih-alih menggunakan antarmuka untuk mencapai dinamis pengiriman | Dari fitur bahasa ini, penulis menyampaikan keterbukaan untuk pemrograman generik, secara tegas membantah pernyataan dan [[Penunjuk (ilmu komputer)|pointer]]<nowiki> aritmetika, saat membela pilihan untuk menghilangkan jenis warisan sebagai pemberian yang lebih berguna bahasa, mendorong alih-alih menggunakan antarmuka untuk mencapai dinamis pengiriman{{Efn|Questions "How do I get dynamic dispatch of methods?" and "Why is there no type inheritance?" in the language FAQ.</nowiki><ref>}} 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.</ref> | ||
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.<ref>Rob Pike. [http://blog.golang.org/slices Arrays, slices (and strings): The mechanics of 'append']. ''The Go Blog''. 26 September 2013.</ref> tim Google yang dirancang bahasa dibangun setidaknya satu compiler untuk eksperimental dialek Go secara umum, tapi tidak merilisnya.<ref>[http://channel9.msdn.com/Blogs/Charles/Erik-Meijer-and-Robert-Griesemer-Go E2E: Erik Meijer and Robert Griesemer – Going Go]. ''Channel 9''. Microsoft. 7 May 2012.</ref> | |||
Setelah awalnya menghilangkan [[Penanganan pengecualian|pengecualian]], pengecualian-seperti panic/recover mekanisme akhirnya ditambahkan untuk bahasa, yang mana penulis menyarankan menggunakan untuk memecahkan kesalahan seperti orang-orang yang harus menghentikan seluruh program atau permintaan server, atau sebagai jalan pintas untuk menyebarkan kesalahan tumpukan dalam paket (tetapi tidak seluruh paket-batas; tidak, kesalahan kembali adalah standar API).<ref>[https://code.google.com/p/go-wiki/wiki/PanicAndRecover Panic And Recover] , Go wiki</ref><ref>[http://golang.org/doc/devel/weekly.html#2010-03-30 Weekly Snapshot History]. ''golang.org''.</ref><ref>[https://groups.google.com/group/golang-nuts/browse_thread/thread/1ce5cd050bb973e4 Proposal for an exception-like mechanism]. ''golang-nuts''. 25 March 2010.</ref><ref>[https://golang.org/doc/effective_go.html#panic Effective Go]. ''golang.org''.</ref> | |||
=== Kritik === | |||
kritikus Go menyatakan bahwa: | |||
* kurangnya waktu kompilasi generik mengarah ke kode duplikasi, metaprogramming tidak dapat diperiksa secara statis<ref>Will Yager, [http://yager.io/programming/go.html Why Go is not Good]</ref><ref>Egon Elbre, [https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/edit# Summary of Go Generics discussions]</ref> dan standar perpustakaan tidak menawarkan algoritme generik<ref>Brad Fitzpatrick. [https://talks.golang.org/2014/gocon-tokyo.slide#50 Go: 90% Perfect, 100% of the time].</ref> | |||
* kurangnya ekstensi bahasa (melalui, misalnya, operator overloading) membuat tugas-tugas tertentu lebih verbose<ref>Danny Gratzer, [http://jozefg.bitbucket.org/posts/2013-08-23-leaving-go.html Leaving Go]</ref> | |||
* jenis sistem kurang pengetikan [[Hindley–Milner]], menghambat keamanan dan/atau ekspresi<ref>Will Yager, [http://yager.io/programming/go.html Why Go is not Good]</ref><ref>Jared Forsyth, [https://jaredly.github.io/2014/03/22/rust-vs-go/ Rust vs. Go]</ref><ref>Janos Dobronszki, [http://crufter.com/2014/12/01/everyday-hassles-in-go/ Everyday Hassles in Go]</ref> | |||
* Batas jeda dan overhead [[Pengumpulan sampah (ilmu komputer)|garbage collection]] (''GC'') Go yang digunakan sistem pemrograman dibandingkan dengan bahasa-bahasa dengan manual manajemen memori. | |||
Bahasa desainer berpendapat bahwa ini trade-off yang penting untuk menuju kesuksesan,<ref>Rob Pike, [http://commandcenter.blogspot.de/2012/06/less-is-exponentially-more.html Less is exponentially more]</ref> dan menjelaskan beberapa keputusan tertentu pada suhu udara,<ref>The Go Authors, [http://golang.org/doc/faq Frequently Asked Questions (FAQ)]</ref> meskipun mereka mengekspresikan keterbukaan untuk menambahkan beberapa bentuk dari pemrograman generik di masa depan, dan pragmatis perbaikan di daerah-daerah seperti standardisasi cara-cara untuk menerapkan kode generasi.<ref>Rob Pike, [https://blog.golang.org/generate Generating code]</ref> | |||
GC telah ditingkatkan untuk sub-milidetik waktu jeda dalam versi kemudian.<ref>Rhys Hiltner. [https://blog.twitch.tv/gos-march-to-low-latency-gc-a6fa96f06eb7#.68hdx6qc1 Go’s march to low-latency GC]. Twitch.tv. 2016-07-05.</ref><ref>Richard Hudson, [http://golang.org/s/go14gc Go 1.4+ Garbage Collection (GC) Plan and Roadmap]</ref><ref>Brian Hatfield. [https://twitter.com/brianhatfield/status/804355831080751104?lang=en SUB. MILLISECOND. PAUSE. TIME. ON. AN. 18. GIG. HEAP]. 2016-12-01.</ref> Namun, para pengembang mengakui bahwa GC ini algoritme ini tidak [[Komputasi waktu nyata|hard real-time]].{{Butuh rujukan|date=December 2016}} | |||
== Alat-alat == | |||
Go memiliki beberapa perkakas [[pengawakutuan]], pengujian, dan ''code-vetting'' seperti banyak distribusi bahasa lain. Distribusi Go bisanya memiliki alat-alat: | |||
* <code>go build</code>, yang membangun binari Go biner hanya menggunakan informasi dalam sumber file sendiri, tidak terpisah makefiles | |||
* <code>go test</code>, untuk unit pengujian dan microbenchmarks | |||
* <code>go fmt</code>, untuk format kode | |||
* <code>go get</code>, untuk mengambil dan menginstal paket jarak jauh | |||
* <code>go vet</code>, analisis statis mencari potensi kesalahan dalam kode | |||
* <code>go run</code>, sebuah jalan pintas untuk membangun dan mengeksekusi kode | |||
* <code>godoc</code>, untuk menampilkan dokumentasi atau melayani via HTTP | |||
* <code>gorename</code>, untuk mengganti nama variabel, fungsi, dan jenis-cara aman | |||
* <code>go generate</code>, cara standar untuk memanggil kode generator | |||
Hal ini juga termasuk profiling dan dukungan debugging, runtime instrumentasi (untuk, misalnya, melacak pengumpulan sampah jeda), dan kondisi balapan tester. | |||
Ada sebuah ekosistem alat pihak ketiga yang menambahkan untuk distribusi standar, seperti <code>gocode</code>, yang memungkinkan kode autocompletion dalam banyak teks editor, <code>goimports</code> (oleh seorang anggota tim), yang secara otomatis menambahkan/menghapus paket impor yang diperlukan, <code>errcheck</code>, yang mendeteksi kode yang mungkin tidak sengaja mengabaikan kesalahan, dan banyak lagi. Plugin yang ada untuk menambahkan dukungan bahasa untuk beberapa banyak digunakan [[Penyunting teks|editor teks]]. Selain itu, beberapa [[Lingkungan pengembangan terpadu|Ide]] yang tersedia. Misalnya, LiteIDE, yang dicap sebagai "simpel, sumber terbuka, [[Lingkungan pengembangan terpadu|IDE]] [[lintas platform]] untuk Go",<ref>[https://github.com/visualfc/liteide LiteIDE].</ref> dan GoLand, yang mengklaim untuk menjadi "mampu dan ergonomis."<ref>[https://www.jetbrains.com/go/ GoLand].</ref> | |||
== Catatan == | |||
{{notelist}} | |||
== Pranala luar == | |||
* {{Situs web resmi|https://golang.org}} | |||
* [https://golang.org/doc/ Dokumentasi Go] {{Webarchive|url=https://web.archive.org/web/20211121000012/https://golang.org/doc/ |date=2021-11-21 }} | |||
* [https://blog.golang.org Blog Go] {{Webarchive|url=https://web.archive.org/web/20210808074346/https://blog.golang.org/ |date=2021-08-08 }} | |||
* [https://golang.org/pkg/ Paket Go] {{Webarchive|url=https://web.archive.org/web/20210702221049/https://golang.org/pkg/ |date=2021-07-02 }} | |||
* {{GitHub|golang/go|Go}} | |||
{{Authority control}} | |||
== Referensi == | |||
<references /> | |||
== Sumber dan atribusi == | == Sumber dan atribusi == | ||
Konten artikel ini diadaptasi dari [https://id.wikipedia.org/w/index.php?title=Go+%28bahasa+pemrograman%29&oldid=29515649 Wikipedia bahasa Indonesia], revisi 29515649 (2026-08-02T11:46:48Z), yang tersedia berdasarkan lisensi Creative Commons Atribusi-BerbagiSerupa (CC BY-SA). Gambar pada artikel ini bersumber dari Wikimedia Commons dan mengikuti ketentuan lisensi masing-masing berkas. Mohon gunakan konten dan media secara bijak serta sesuai dengan ketentuan lisensi yang berlaku. | |||
[https://id.wikipedia.org/w/index.php?title= | |||
revisi 29515649 (2026-08-02T11:46:48Z) | <!-- WIKI_UNISSULA_PRESENTATION_V4 --> | ||
Atribusi-BerbagiSerupa (CC BY-SA) pada | |||
Revisi terkini sejak 9 September 2026 06.24
Go (sering disebut sebagai Golang) adalah bahasa pemrograman yang dibuat di Google[1] pada tahun 2009 oleh Robert Griesemer, Rob Pike, dan Ken Thompson.[2] Go adalah bahasa pemrograman sumber terbuka yang mudah, sederhana, efisien. Selain itu, Go merupakan bahasa pemrograman yang dikompilasi, seperti Java, yaitu bahasa pemrograman yang dikompilasi dan menggunakan sintaks mirip bahasa C, dengan fitur pengumpulan sampah, penulisan terstruktur, keamanan memori, dan pemrograman yang konkuren serta berurutan.[3] Kompiler dan Integrated Development Environment (IDE) lainnya disediakan oleh Google dari awal secara bebas dan sumber terbuka.[4]
Sejarah
Golang pertama kali dirilis pada bulan November 2009 dan telah digunakan di lingkungan produksi oleh Google maupun perusahaan lain.[5]
Dua implementasi utama yang ada:
- Google Go compiler, "gc", yang dikembangkan sebagai perangkat lunak sumber terbuka. Pihaknya menargetkan berbagai platform, termasuk Linux, OS X, Windows, berbagai BSD dan Unix versi, dan juga (sejak 2015) perangkat selular (termasuk ponsel pintar).[6]
- Kompiler kedua, gccgo, merupakan front-end GCC.[7][8]
"Gc" rantai alat telah self-hosting sejak versi 1.5.[9]
Go awalnya merupakan sebuah percobaan oleh para insinyur Google Robert Griesemer, Rob Pike, dan Ken Thompson untuk merancang sebuah bahasa pemrograman baru yang dapat mengatasi berbagai kritik umum terhadap bahasa lain, sambil tetap mempertahankan karakteristik positifnya.
Dalam pengembangannya, mereka mempertimbangkan berbagai karakteristik yang terdapat pada bahasa pemrograman lain, seperti:[10]
- bertipe statis, skalabel untuk sistem yang besar (seperti Java dan C++)
- produktif serta mudah dibaca tanpa memerlukan kata kunci dan pengulangan kode[11] ("light on the page" seperti bahasa dinamis)
- tidak memerlukan lingkungan pengembangan terintegrasi, tetapi mendukung mereka dengan baik
- mendukung jaringan dan multiprocessing
Dalam wawancara terakhir, semua dari tiga perancang bahasa tidak suka terhadap kompleksitas C++ sehingga menjadi motivasi utama untuk mendesain sebuah bahasa baru.[12][13][14]
Google merilis Go 1.0 pada bulan Maret 2012.[15][16]
Versi
Go 1 menjamin kompatibilitas[17] untuk spesifikasi bahasa dan bagian utama dari pustaka standar. Semua versi hingga perilisan Go 1.19 saat[18] telah menepati janji ini.
Setiap perilisan utama Go didukung hingga ada dua perilisan utama yang lebih baru.[19]
| Perilisan | Status | Tanggal perilisan | Akhir pemeliharaan |
|---|---|---|---|
| 2012-03-28 | 2013-12-01 | ||
| 2013-05-13 | 2014-06-18 | ||
| 2013-12-01 | 2014-12-10 | ||
| 2014-06-18 | 2015-08-19 | ||
| 2014-12-10 | 2016-02-17 | ||
| 2015-08-19 | 2016-08-15 | ||
| 2016-02-17 | 2017-02-16 | ||
| 2016-08-15 | 2017-08-24 | ||
| 2017-02-16 | 2018-02-16 | ||
| 2017-08-24 | 2018-08-24 | ||
| 2018-02-16 | 2019-02-25 | ||
| 2018-08-24 | 2019-09-03 | ||
| 2019-02-25 | 2020-02-25 | ||
| 2019-09-03 | 2020-08-11 | ||
| 2020-02-25 | 2021-02-16 | ||
| 2020-08-11 | 2021-08-16 | ||
| 2021-02-16 | 2022-03-15 | ||
| 2021-08-16 | 2022-08-02 | ||
| 2022-03-15 | 2022-08-02 | ||
| 2022-08-02 | 2023-02-01 | ||
| 2023-02-01 | 2024-02-06 | ||
| 2023-08-08 | 2024-08-13 | ||
| 2024-02-06 | 2025-02-11 | ||
| 2024-08-13 | Q3 2025 | ||
| 2025-02-11 | Q1 2026 | ||
| Q3 2025 | Q3 2026 | ||
Desain bahasa
Go lebih dikenal sebagai bagian dari tradisi C, namun menghadirkan banyak perubahan untuk meningkatkan efisiensi, kesederhanaan, dan keamanan. Go terdiri dari:
- Sintaks dan lingkungan mengadopsi pola-pola yang lebih umum dalam bahasa dinamis:[20]
- Khas pendekatan untuk masalah tertentu:
- Fasilitas konkruensi bawaan: proses ringan (lightweight process), saluran, dan yang
memilihpernyataan. - Sebuah antarmuka sistem di tempat virtual warisan, dan jenis embedding bukan non-virtual warisan.
- Sebuah toolchain yang, secara default, menghasilkan biner asli yang ditautkan secara statis tanpa dependensi eksternal.
- Fasilitas konkruensi bawaan: proses ringan (lightweight process), saluran, dan yang
- Spesifikasi bahasa dirancang agar cukup sederhana sehingga dapat dipahami secara menyeluruh oleh seorang programmer,[24] di bagian dengan menghilangkan fitur-fitur umum untuk bahasa yang sama.
Sintaks
Sintaks Go meliputi perubahan dari C bertujuan menjaga kode ringkas dan mudah dibaca. Gabungan deklarasi/inisialisasi operator diperkenalkan yang memungkinkan programmer untuk menulis saya := 3 atau s := "Hello, world!", tanpa menentukan jenis variabel. Ini kontras dengan C int i = 3; dan const char *s = "Hello, world!";. Titik koma masih menghentikan pernyataan, tetapi secara implisit ketika akhir baris yang terjadi. Fungsi dapat mengembalikan beberapa nilai-nilai, dan mengembalikan result, err pasangan adalah cara konvensional yang berfungsi menunjukkan kesalahan untuk penelepon di Go. Go menambahkan sintaks literal untuk menginisialisasi struct parameter dengan nama, dan untuk inisialisasi peta dan irisan. Sebagai alternatif untuk C tiga pernyataan for loop, Ekspresi Go range memungkinkan ringkas iterasi lebih dari array, irisan, string, peta, dan saluran.
Jenis (Tipe Data)
Go memiliki sejumlah tipe data bawaan yang ditanamkan, termasuk numerik (byte, int64, float32, dll.), boolean, dan string karakter (string). String yang berubah; built-in operator dan kata kunci (bukan fungsi) memberikan rangkaian, perbandingan, dan UTF-8 encoding dan decoding.[25] jenis Catatan dapat didefinisikan dengan kata kunci struct.
Untuk masing-masing tipe T dan setiap non-negatif konstanta integer n, ada sebuah array jenis dilambangkan [n]T; array yang berbeda-beda panjangnya sehingga dari jenis yang berbeda. Array dinamis yang tersedia sebagai "iris", dilambangkan []T untuk beberapa jenis T. Ini memiliki panjang dan kapasitas menentukan ketika baru memori yang harus dialokasikan untuk memperluas array. Beberapa irisan dapat berbagi mereka mendasari memori.[26][27]
Petunjuk tersedia untuk semua type, dan inter-ke-T jenis dilambangkan *T. Alamat-mengambil dan tipuan gunakan & dan * operator di C, atau terjadi secara implisit melalui metode panggilan atau atribut akses sintaks.[28] tidak Ada pointer aritmetika, kecuali melalui khusus jenis unsafe.Pointer di perpustakaan standar.
Untuk pasangan dari jenis K, V, jenis map[K]V adalah jenis tabel hash memetakan tipe-K kunci untuk tipe-V nilai-nilai. Tabel Hash yang dibangun ke dalam bahasa, dengan sintaks khusus dan built-in fungsi. chan T adalah saluran yang memungkinkan pengiriman nilai-nilai dari tipe T antara bersamaan Go proses.
Selain dukungan untuk antarmuka, Go tipe sistem adalah nominal: type kata kunci yang dapat digunakan untuk mendefinisikan baru bernama jenis, yang berbeda dari lainnya bernama jenis yang memiliki letak yang sama (dalam kasus sebuah struct, anggota yang sama dalam urutan yang sama). Beberapa konversi antara jenis (misalnya, antara berbagai tipe integer) pra-didefinisikan dan menambahkan jenis baru dapat menentukan konversi tambahan, tapi konversi antara nama jenis harus selalu dipanggil secara eksplisit.[29] sebagai contoh, type kata kunci yang dapat digunakan untuk mendefinisikan tipe untuk IPv4 alamat, yang adalah 32-bit unsigned integer.
Dengan jenis definisi tersebut, ipv4addr(x) menafsirkan uint32 nilai x sebagai alamat IP. Menginisiasialisasi variabel bertipe ipv4addr menggunakan nilai yang tidak sesuai akan menghasilkan kesalahan tipe.
Ekspresi konstan dapat berupa diketik atau "untyped"; mereka diberi jenis ketika ditugaskan untuk mengetik variabel jika nilai mereka mewakili melewati waktu kompilasi cek.[30]
Fungsi jenis ini adalah yang ditunjukkan oleh func kata kunci; mereka mengambil nol atau lebih parameter dan kembali nol atau lebih nilai-nilai yang diketik. Parameter dan mengembalikan nilai-nilai menentukan tipe fungsi; dengan demikian, func (string, int32) (int, error) adalah jenis fungsi yang mengambil string dan 32-bit signed integer, dan menandatangani sebuah integer (default lebar) dan nilai built-in antarmuka jenis error.
Setiap nama memiliki metode yang ditetapkan terkait dengan itu. Alamat IP contoh di atas dapat diperpanjang dengan sebuah metode untuk memeriksa apakah nilai adalah standar yang dikenal. Karena mengetik nominal, definisi metode ini menambah sebuah method ke ipv4addr, tetapi tidak pada uint32. Sedangkan method memiliki definisi khusus dan memanggil sintaks, tidak ada method yang berbeda jenis.[31]
Sistem antarmuka
Go menyediakan dua fitur yang menggantikan kelas warisan.
Yang pertama adalah embedding, yang dapat dilihat sebagai bentuk otomatis dari komposisi atau delegasi.[32]:255
Sebuah antarmuka menentukan satu set jenis dengan daftar yang diperlukan metode dan jenis mereka dan puas dengan setiap jenis yang memiliki metode yang diperlukan. Pelaksana jenis yang tidak perlu menentukan mereka mengimplementasikan interface, jadi jika Shape, Square dan Circle didefinisikan sebagai: Kedua Square dan Circle yang secara implisit Shape dan dapat ditugaskan untuk Shape-diketik variabel.:263–268 Dalam bahasa formal, antarmuka Go sistem menyediakan struktural daripada nominal mengetik. Interface dapat menanamkan antarmuka lain dengan efek menciptakan gabungan antarmuka yang puas dengan tepat jenis yang menerapkan tertanam antarmuka dan metode-metode yang baru yang didefinisikan antarmuka menambahkan.:270
Go standar perpustakaan menggunakan antarmuka untuk memberikan genericity di beberapa tempat, termasuk sistem input/output yang didasarkan pada konsep-konsep dari Reader dan Writer.:282–283
Selain memanggil metode melalui antarmuka, Go memungkinkan mengubah antarmuka nilai-nilai untuk jenis lain dengan run-time type check. Bahasa konstruksi untuk melakukannya adalah jenis pernyataan,[33] yang memeriksa terhadap satu potensi jenis, dan jenis switch,[34] yang memeriksa terhadap beberapa jenis.
Yang kosong antarmuka interface{} adalah sudut yang penting kasus ini karena hal ini dapat merujuk ke item dari setiap jenis beton. Hal ini mirip dengan Object class dalam Java atau C# dan puas dengan jenis apa pun, termasuk built-in jenis seperti int.:284 Kode menggunakan kosong interface tidak hanya memanggil metode (atau built-in operator) yang disebut-objek, tetapi dapat menyimpan interface{} nilai, cobalah untuk mengubahnya menjadi lebih berguna melalui jenis jenis pernyataan atau jenis switch, atau periksa dengan Go mencerminkan paket.[35] Karena interface{} dapat merujuk ke nilai apapun, itu adalah cara yang terbatas untuk melarikan diri dari batasan-batasan statis mengetik, seperti void* 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.[36] Seperti beberapa jenis lain diimplementasikan dengan menggunakan pointer pada Go, antarmuka nilai-nilai nihil jika tidak terinisialisasi.[37]
Sistem paket
Dalam sistem paket go, setiap paket memiliki pola (misalnya, "compress/bzip2" atau "golang.org/x/net/html") dan nama (misalnya, bzip2 atau html). Secara default, definisi dari paket lain harus selalu diawali dengan nama paket lain tersebut, dan hanya paket dengan nama diawali kapital yang bisa diakses di paket lain: io.Reader umum tapi bzip2.reader tidak.[38] Perintah go get dapat mengambil paket yang disimpan dalam repositori jauh seperti GitHub,[39] 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.[40]
Proposal yang ada untuk memperkenalkan tepat paket solusi manajemen untuk Go mirip dengan Karat's sistem cargo atau Node's npm sistem.[41]
Concurrency: goroutines dan channel
Bahasa go memiliki built-in fasilitas, serta dukungan perpustakaan, untuk menulis program yang konkuren. Konkurensi mengacu tidak hanya untuk pararelisme CPU , tetapi juga untuk asynchrony: membiarkan operasi lambat seperti database atau jaringan dijalankan saat program melakukan pekerjaan lain, seperti yang umum dalam program server.[42]
Model konkurensi primer go adalah goroutine, suatu jenis green threads. Suatu fungsi yang dipanggil dengan kata kunci go akan memulai fungsi tersebut di goroutine baru. 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.:10
Sementara standar perpustakaan menampilkan paket yang paling klasik concurrency control struktur (mutex kunci, dll.) tersedia,:151–152 idiomatik bersamaan program bukan sukai saluran, yang memberikan mengirim pesan antara goroutines.[43] Opsional buffer menyimpan pesan di FIFO order:43 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; <-ch adalah ekspresi yang menyebabkan melaksanakan goroutine untuk memblokir sampai nilai datang di channel ch, sedangkan ch <- x mengirimkan nilai x (mungkin memblokir sampai lain goroutine menerima nilai). Built-in switch-suka select pernyataan yang dapat digunakan untuk mengimplementasikan non-blocking komunikasi pada beberapa saluran; lihat di bawah untuk contoh. Go memiliki memori model yang menggambarkan bagaimana goroutines harus menggunakan saluran atau operasi lainnya untuk aman berbagi data.[44]
Keberadaan saluran set berpisah dari aktor model-gaya konkuren bahasa seperti Erlang, di mana 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.:147
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.[45] Saluran juga telah ditemukan menggunakan lebih dari biasanya gagasan interprocess communication, seperti melayani sebagai concurrency-daftar aman dari daur ulang buffer,[46] pelaksana coroutines (yang membantu menginspirasi nama goroutine),[47] dan menerapkan iterator.[48]
Konvensi struktural terkait konkurensi dari 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 ),[49] Go tidak menyediakan built-in gagasan aman atau diverifikasi concurrency.[50] 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.
Kesesuaian untuk pemrograman paralel
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.[51] 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.[52]
Kurangnya kondisi balapan keselamatan
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.[53][54]
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.:155
Kelalaian
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{{Efn|Questions "How do I get dynamic dispatch of methods?" and "Why is there no type inheritance?" in the language FAQ.[55]
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.[56] tim Google yang dirancang bahasa dibangun setidaknya satu compiler untuk eksperimental dialek Go secara umum, tapi tidak merilisnya.[57]
Setelah awalnya menghilangkan pengecualian, pengecualian-seperti panic/recover mekanisme akhirnya ditambahkan untuk bahasa, yang mana penulis menyarankan menggunakan untuk memecahkan kesalahan seperti orang-orang yang harus menghentikan seluruh program atau permintaan server, atau sebagai jalan pintas untuk menyebarkan kesalahan tumpukan dalam paket (tetapi tidak seluruh paket-batas; tidak, kesalahan kembali adalah standar API).[58][59][60][61]
Kritik
kritikus Go menyatakan bahwa:
- kurangnya waktu kompilasi generik mengarah ke kode duplikasi, metaprogramming tidak dapat diperiksa secara statis[62][63] dan standar perpustakaan tidak menawarkan algoritme generik[64]
- kurangnya ekstensi bahasa (melalui, misalnya, operator overloading) membuat tugas-tugas tertentu lebih verbose[65]
- jenis sistem kurang pengetikan Hindley–Milner, menghambat keamanan dan/atau ekspresi[66][67][68]
- Batas jeda dan overhead garbage collection (GC) Go yang digunakan sistem pemrograman dibandingkan dengan bahasa-bahasa dengan manual manajemen memori.
Bahasa desainer berpendapat bahwa ini trade-off yang penting untuk menuju kesuksesan,[69] dan menjelaskan beberapa keputusan tertentu pada suhu udara,[70] meskipun mereka mengekspresikan keterbukaan untuk menambahkan beberapa bentuk dari pemrograman generik di masa depan, dan pragmatis perbaikan di daerah-daerah seperti standardisasi cara-cara untuk menerapkan kode generasi.[71]
GC telah ditingkatkan untuk sub-milidetik waktu jeda dalam versi kemudian.[72][73][74] Namun, para pengembang mengakui bahwa GC ini algoritme ini tidak hard real-time.Templat:Butuh rujukan
Alat-alat
Go memiliki beberapa perkakas pengawakutuan, pengujian, dan code-vetting seperti banyak distribusi bahasa lain. Distribusi Go bisanya memiliki alat-alat:
go build, yang membangun binari Go biner hanya menggunakan informasi dalam sumber file sendiri, tidak terpisah makefilesgo test, untuk unit pengujian dan microbenchmarksgo fmt, untuk format kodego get, untuk mengambil dan menginstal paket jarak jauhgo vet, analisis statis mencari potensi kesalahan dalam kodego run, sebuah jalan pintas untuk membangun dan mengeksekusi kodegodoc, untuk menampilkan dokumentasi atau melayani via HTTPgorename, untuk mengganti nama variabel, fungsi, dan jenis-cara amango generate, cara standar untuk memanggil kode generator
Hal ini juga termasuk profiling dan dukungan debugging, runtime instrumentasi (untuk, misalnya, melacak pengumpulan sampah jeda), dan kondisi balapan tester.
Ada sebuah ekosistem alat pihak ketiga yang menambahkan untuk distribusi standar, seperti gocode, yang memungkinkan kode autocompletion dalam banyak teks editor, goimports (oleh seorang anggota tim), yang secara otomatis menambahkan/menghapus paket impor yang diperlukan, errcheck, yang mendeteksi kode yang mungkin tidak sengaja mengabaikan kesalahan, dan banyak lagi. Plugin yang ada untuk menambahkan dukungan bahasa untuk beberapa banyak digunakan editor teks. Selain itu, beberapa Ide yang tersedia. Misalnya, LiteIDE, yang dicap sebagai "simpel, sumber terbuka, IDE lintas platform untuk Go",[75] dan GoLand, yang mengklaim untuk menjadi "mampu dan ergonomis."[76]
Catatan
Pranala luar
- Templat:Situs web resmi
- Dokumentasi Go Templat:Webarchive
- Blog Go Templat:Webarchive
- Paket Go Templat:Webarchive
- Templat:GitHub
Referensi
- ↑ Jason Kincaid. Google’s Go: A New Programming Language That’s Python Meets C++. TechCrunch. 10 November 2009.More than one of |work= dan |newspaper= specified (bantuan)
- ↑ Language Design FAQ. golang.org. 16 January 2010.
- ↑ Cade Metz. Google Go boldly goes where no code has gone before. The Register. 5 May 2011.
- ↑ Salinan arsip.
- ↑ Go FAQ: Is Google using Go internally?.
- ↑ Google's In-House Programming Language Now Runs on Phones. wired.com. 19 August 2015.
- ↑ FAQ: Implementation. golang.org. 16 January 2010.
- ↑ Installing GCC: Configuration.
- ↑ Go 1.5 Release Notes.
- ↑ Rob Pike. Another Go at Language Design. Stanford EE Computer Systems Colloquium. Stanford University. 28 April 2010. Video available .
- ↑ Frequently Asked Questions (FAQ) - The Go Programming Language. golang.org.
- ↑ Andrew Binstock. Dr. Dobb's: Interview with Ken Thompson. 18 May 2011.
- ↑ Rob Pike. Less is exponentially more. 2012.
- ↑ Robert Griesemer. The Evolution of Go. 2015.
- ↑ Stephen Shankland. Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google. CBS Interactive Inc. 2012-03-30.
- ↑ Release History.
- ↑ Go 1 and the Future of Go Programs. golang.org.
- ↑ Go 1.19 Release Notes. go.dev.
- ↑ Release History. golang.org.
- ↑ Rob Pike. The Go Programming Language. YouTube.
- ↑ sumber pada Wikipedia bahasa Indonesia
- ↑ Download and install packages and dependencies - go - The Go Programming Language ; see godoc.org for addresses and documentation of some packages
- ↑ GoDoc. godoc.org.
- ↑ Rob Pike, on The Changelog podcast
- ↑ Rob Pike, Strings, bytes, runes and characters in Go , 23 October 2013
- ↑ Andrew Gerrand, Go Slices: usage and internals
- ↑ The Go Authors, Effective Go: Slices
- ↑ The Go authors Selectors - The Go Programming Language Specification and Calls - The Go Programming Language Specification
- ↑ The Go Programming Language Specification. golang.org.
- ↑ The Go Programming Language Specification. golang.org.
- ↑ The Go Programming Language Specification. golang.org.
- ↑ Mark Summerfield. Programming in Go: Creating Applications for the 21st Century. Addison-Wesley. 2012.
- ↑ The Go Programming Language Specification. golang.org.
- ↑ The Go Programming Language Specification. golang.org.
- ↑ reflect.ValueOf(i interface{}) converts an interface{} to a reflect.Value that can be further inspected
- ↑ Go Data Structures: Interfaces.
- ↑ The Go Programming Language Specification. golang.org.
- ↑ A Tutorial for the Go Programming Language. The Go Programming Language. Google.
- ↑ go - The Go Programming Language. golang.org.
- ↑ How to Write Go Code. golang.org.
- ↑ Go Packaging Proposal Process.
- ↑ Rob Pike, Concurrency is not Parallelism
- ↑ Effective Go. golang.org.
- ↑ The Go Memory Model.
- ↑ Go Concurrency Patterns. golang.org.
- ↑ John Graham-Cumming, Recycling Memory Buffers in Go
- ↑ tree.go.
- ↑ Ewen Cheslack-Postava, Iterators in Go
- ↑ Brian W. Kernighan, A Descent Into Limbo
- ↑ The Go Memory Model. Google.
- ↑ sumber pada Wikipedia bahasa Indonesia
- ↑ sumber pada Wikipedia bahasa Indonesia
- ↑ Russ Cox, Off to the Races
- ↑ Rob Pike. Go at Google: Language Design in the Service of Software Engineering. Google, Inc. October 25, 2012. "There is one important caveat: Go is not purely memory safe in the presence of concurrency."
- ↑ }} 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.
- ↑ Rob Pike. Arrays, slices (and strings): The mechanics of 'append'. The Go Blog. 26 September 2013.
- ↑ E2E: Erik Meijer and Robert Griesemer – Going Go. Channel 9. Microsoft. 7 May 2012.
- ↑ Panic And Recover , Go wiki
- ↑ Weekly Snapshot History. golang.org.
- ↑ Proposal for an exception-like mechanism. golang-nuts. 25 March 2010.
- ↑ Effective Go. golang.org.
- ↑ Will Yager, Why Go is not Good
- ↑ Egon Elbre, Summary of Go Generics discussions
- ↑ Brad Fitzpatrick. Go: 90% Perfect, 100% of the time.
- ↑ Danny Gratzer, Leaving Go
- ↑ Will Yager, Why Go is not Good
- ↑ Jared Forsyth, Rust vs. Go
- ↑ Janos Dobronszki, Everyday Hassles in Go
- ↑ Rob Pike, Less is exponentially more
- ↑ The Go Authors, Frequently Asked Questions (FAQ)
- ↑ Rob Pike, Generating code
- ↑ Rhys Hiltner. Go’s march to low-latency GC. Twitch.tv. 2016-07-05.
- ↑ Richard Hudson, Go 1.4+ Garbage Collection (GC) Plan and Roadmap
- ↑ Brian Hatfield. SUB. MILLISECOND. PAUSE. TIME. ON. AN. 18. GIG. HEAP. 2016-12-01.
- ↑ LiteIDE.
- ↑ GoLand.
Sumber dan atribusi
Konten artikel ini diadaptasi dari Wikipedia bahasa Indonesia, revisi 29515649 (2026-08-02T11:46:48Z), yang tersedia berdasarkan lisensi Creative Commons Atribusi-BerbagiSerupa (CC BY-SA). Gambar pada artikel ini bersumber dari Wikimedia Commons dan mengikuti ketentuan lisensi masing-masing berkas. Mohon gunakan konten dan media secara bijak serta sesuai dengan ketentuan lisensi yang berlaku.