Lompat ke isi

Go (bahasa pemrograman): Perbedaan antara revisi

Dari Wikipedia bahasa Indonesia, ensiklopedia bebas
Konten dihapus Konten ditambahkan
Purwana (bicara | kontrib)
Dibuat dengan menerjemahkan halaman "Go (programming language)"
 
Malchioness (bicara | kontrib)
Fitur saranan suntingan: 2 pranala ditambahkan.
Tag: halaman dengan galat kutipan VisualEditor Suntingan perangkat seluler Suntingan peramban seluler Tugas pengguna baru Disarankan: tambahkan pranala
 
(48 revisi perantara oleh 24 pengguna tidak ditampilkan)
Baris 1: Baris 1:
{{periksaterjemahan|en|Go (programming language)}}
{{Infobox programming language|name=Go|logo=File:golang.png|paradigm=[[compiled language|compiled]], [[concurrent programming|concurrent]], [[imperative programming|imperative]], [[structured programming|structured]]|year={{start date and age|2009|11|10}}|designer=Robert Griesemer<br ></span>[[Rob Pike]]<br />[[Ken Thompson]]|developer=[[Google|Google LLC.]]|latest_release_version=1.10|latest_release_date={{start date and age|2018|02|16}}<ref name="release_page">{{cite web|title=Release History - The Go Programming Language|url=https://golang.org/doc/devel/release.html#go1.10|accessdate=16 February 2018}}</ref>|typing=[[strong typing|strong]], [[static typing|static]], [[type inference|inferred]], [[structural typing|structural]]<ref name="structural_typing">{{cite web |title=Why doesn't Go have "implements" declarations? |url=https://golang.org/doc/faq#implements_interface |work=golang.org |accessdate=1 October 2015}}</ref><ref>{{cite web |url=https://twitter.com/rob_pike/status/546973312543227904 |title=Rob Pike on Twitter |last=Pike |first=Rob |date=2014-12-22 |accessdate=2016-03-13 |quote=Go has structural typing, not duck typing. Full interface satisfaction is checked and required. }}</ref>|implementations=gc, gccgo|influenced_by=[[Alef (programming language)|Alef]], [[APL (programming language)|APL]],<ref name="hgophers">{{cite web |url=https://talks.golang.org/2014/hellogophers.slide#21 |title=Hello Gophers |last=Pike |first=Rob |date=2014-04-24 |accessdate=2016-03-11 }}</ref> [[BCPL]],<ref name="hgophers">{{cite web |url=https://talks.golang.org/2014/hellogophers.slide#21 |title=Hello Gophers |last=Pike |first=Rob |date=2014-04-24 |accessdate=2016-03-11 }}</ref> [[C (programming language)|C]], [[Communicating sequential processes|CSP]], [[Limbo (programming language)|Limbo]], [[Modula]], [[Newsqueak]], [[Oberon (programming language)|Oberon]], [[Occam (programming language)|occam]], [[Pascal (programming language)|Pascal]],<ref name="langfaq"/> [[Smalltalk]]<ref>{{cite web |title=The Evolution of Go|url=https://talks.golang.org/2015/gophercon-goevolution.slide#19|accessdate=2015-09-26}}</ref>|influenced=[[Crystal (programming language)|Crystal]]|operating_system=[[Linux]], [[macOS]], [[FreeBSD]], [[NetBSD]], [[OpenBSD]],<ref name=openbsd>{{cite web |url=http://ports.su/lang/go |title=lang/go: go-1.4 – Go programming language |work=OpenBSD ports |date=2014-12-23 |accessdate=2015-01-19}}</ref> [[Windows]], [[Plan 9 from Bell Labs|Plan 9]],<ref>{{cite web|url=http://go-lang.cat-v.org/os-ports|title=Go Porting Efforts|date=12 January 2010|work=Go Language Resources|publisher=cat-v|accessdate=18 January 2010}}</ref> [[DragonFly BSD]], [[Solaris (operating system)|Solaris]]|license=[[BSD licenses|BSD]]-style<ref>{{cite web |url=http://golang.org/LICENSE |title=Text file LICENSE |work=The Go Programming Language |publisher=Google |accessdate=5 October 2012}}</ref> + [[software patents|patent]] grant<ref>{{cite web |url=http://golang.org/PATENTS |title=Additional IP Rights Grant |last= |first= |date= |work=The Go Programming Language |publisher=Google |accessdate=5 October 2012}}</ref>|website={{Official URL}}}}'''Go''' (sering disebut sebagai '''golang''') adalah sebuah [[bahasa pemrograman]] yang dibuat di [[Google]]<ref>{{Cite news|url=https://techcrunch.com/2009/11/10/google-go-language/|title=Google’s Go: A New Programming Language That’s Python Meets C++|last=Kincaid|first=Jason|date=10 November 2009|work=TechCrunch|newspaper=TechCrunch|access-date=18 January 2010}}More than one of <code style="color:inherit; border:inherit; padding:inherit;">&#x7C;work=</code> dan <code style="color:inherit; border:inherit; padding:inherit;">&#x7C;newspaper=</code> specified ([[Bantuan:CS1 errors#redundant parameters|bantuan]])
{{Copy edit|date=September 2019}}
[[Kategori:Pages with citations having redundant parameters]]</ref> pada tahun 2009 oleh Robert Griesemer, Rob Pike, dan [[Ken Thompson]].<ref name="langfaq">{{Cite web|url=http://golang.org/doc/go_faq.html|title=Language Design FAQ|date=16 January 2010|website=golang.org|access-date=27 February 2010}}</ref> ini adalah bahasa pemrograman [[Kompilator|yang dihimpun]], ..... diketik dalam bahasa tradisi Algol dan [[C (bahasa pemrograman)|C]], dengan [[Pengumpulan sampah (ilmu komputer)|pengumpulan sampah]], terbatas struktural mengetik, memori keselamatan fitur dan CSP-gaya konkuren pemrograman fitur yang ditambahkan.<ref name="boldly">{{Cite web|url=https://www.theregister.co.uk/2011/05/05/google_go/|title=Google Go boldly goes where no code has gone before|last=Metz|first=Cade|date=5 May 2011|website=The Register}}</ref> compiler dan lainnya alat-alat bahasa yang awalnya dikembangkan oleh Google adalah semua yang [[Perangkat lunak bebas|gratis]] dan [[Sumber terbuka|open source]].<ref>https://golang.org/LICENSE</ref>
{{Infobox programming language
| name = Go
| logo = [[File:Go Logo Blue.svg|frameless|220x80px]]
| paradigm = [[Paradigma pemrograman|Multi-paradigma]]: [[pemrograman bersamaan|bersamaan]] [[pemrograman imperatif|imperatif]], [[pemrograman berorientasi objek|berorientasi objek]]<ref>{{Cite web |url=https://golang.org/doc/faq#Is_Go_an_object-oriented_language |title=Is Go an object-oriented language? |access-date=April 13, 2019 |quote=Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy. |archive-date=2017-05-03 |archive-url=https://web.archive.org/web/20170503205801/https://golang.org/doc/faq#Is_Go_an_object-oriented_language |dead-url=no }}</ref><ref>{{Cite web |url=https://talks.golang.org/2012/chat.slide#5 |title=Go: code that grows with grace |access-date=June 24, 2018 |quote=Go is Object Oriented, but not in the usual way. |archive-date=2022-06-18 |archive-url=https://web.archive.org/web/20220618153138/https://talks.golang.org/2012/chat.slide#5 |dead-url=no }}</ref>
| year = {{start date and age|2009|11|10}}
| designer = Robert Griesemer<br ></span>[[Rob Pike]]<br />[[Ken Thompson]]
| developer = Para Penulis Go<ref name="license" />
| latest_release_version = {{wikidata|property|edit|reference|P548=Q2804309|P348}}
| latest_release_date = {{start date|{{wikidata|qualifier|P548=Q2804309|P348|P577}}}}
| typing = [[Pengetikan kuat dan lemah|Kuat]], [[pengetikan statis|statis]], [[pengetikan inferensi|disimpulkan]], [[pengetikan struktural|struktural]]<ref name="structural_typing">{{cite web |title=Why doesn't Go have "implements" declarations? |url=https://golang.org/doc/faq#implements_interface |work=golang.org |accessdate=1 October 2015 |archive-date=2017-05-03 |archive-url=https://web.archive.org/web/20170503205801/https://golang.org/doc/faq#implements_interface |dead-url=no }}</ref><ref>{{cite web |url=https://twitter.com/rob_pike/status/546973312543227904 |title=Rob Pike on Twitter |last=Pike |first=Rob |date=2014-12-22 |accessdate=2016-03-13 |quote=Go has structural typing, not duck typing. Full interface satisfaction is checked and required. |archive-date=2022-04-07 |archive-url=https://web.archive.org/web/20220407025913/https://twitter.com/rob_pike/status/546973312543227904 |dead-url=no }}</ref>, [[Pengetikan sistem nominal|nominal]]
| implementations = gc, gccgo
| influenced_by = [[Alef (bahasa pemrograman)|Alef]], [[APL (bahasa pemrograman)|APL]],<ref name="hgophers">{{cite web |url=https://talks.golang.org/2014/hellogophers.slide#21 |title=Hello Gophers |last=Pike |first=Rob |date=2014-04-24 |accessdate=2016-03-11 |archive-date=2018-12-01 |archive-url=https://web.archive.org/web/20181201020905/https://talks.golang.org/2014/hellogophers.slide#21 |dead-url=no }}</ref> [[BCPL]],<ref name="hgophers"/> [[C (bahasa pemrograman)|C]], [[Communicating sequential processes|CSP]], [[Limbo (bahasa pemrograman)|Limbo]], [[Modula]], [[Newsqueak]], [[Oberon (bahasa pemrograman)|Oberon]], [[Occam (bahasa pemrograman)|occam]], [[Pascal (bahasa pemrograman)|Pascal]],<ref name="langfaq"/> [[Smalltalk]]<ref>{{cite web|title=The Evolution of Go|url=https://talks.golang.org/2015/gophercon-goevolution.slide#19|accessdate=2015-09-26|archive-date=2017-01-16|archive-url=https://web.archive.org/web/20170116214316/https://talks.golang.org/2015/gophercon-goevolution.slide#19|dead-url=no}}</ref>
| influenced = [[Crystal (bahasa pemrograman)|Crystal]]
| programming language = Go, [[Bahasa rakitan]] (gc); [[C++]] (frontendgo)
| operating_system = [[Linux]], [[macOS]], [[FreeBSD]], [[NetBSD]], [[OpenBSD]],<ref name=openbsd>{{cite web |url=http://ports.su/lang/go |title=lang/go: go-1.4 – Go programming language |work=OpenBSD ports |date=2014-12-23 |accessdate=2015-01-19 |archive-date=2021-09-16 |archive-url=https://web.archive.org/web/20210916184449/http://ports.su/lang/go |dead-url=no }}</ref> [[Windows]], [[Plan 9 from Bell Labs|Plan 9]],<ref>{{cite web|url=http://go-lang.cat-v.org/os-ports|title=Go Porting Efforts|date=12 January 2010|work=Go Language Resources|publisher=cat-v|accessdate=18 January 2010|archive-date=2021-08-12|archive-url=https://web.archive.org/web/20210812111435/http://go-lang.cat-v.org/os-ports|dead-url=no}}</ref> [[DragonFly BSD]], [[Solaris (bahasa pemrograman)|Solaris]]
| license = [[Lisensi BSD#Lisensi 3-klausa|3-clause BSD]]<ref name="license">{{Cite web |url=http://golang.org/LICENSE |title=Text file LICENSE |website=The Go Programming Language |access-date=October 5, 2012 |archive-date=2021-11-01 |archive-url=https://web.archive.org/web/20211101212715/https://golang.org/LICENSE |dead-url=no }}</ref> + hibah [[paten perangkat lunak|paten]]<ref>{{Cite web |url=http://golang.org/PATENTS |title=Additional IP Rights Grant |website=The Go Programming Language |access-date=October 5, 2012 |archive-date=2021-10-26 |archive-url=https://web.archive.org/web/20211026093240/https://golang.org/PATENTS |dead-url=no }}</ref>
| File extensions = .go
| website = {{Official URL}}
}}

'''Go''' (sering disebut sebagai '''Golang''') adalah [[bahasa pemrograman]] yang dibuat di [[Google]]<ref>{{Cite news|url=https://techcrunch.com/2009/11/10/google-go-language/|title=Google’s Go: A New Programming Language That’s Python Meets C++|last=Kincaid|first=Jason|date=10 November 2009|work=TechCrunch|newspaper=TechCrunch|access-date=18 January 2010|archive-date=2010-01-18|archive-url=https://web.archive.org/web/20100118014358/http://www.techcrunch.com/2009/11/10/google-go-language/|dead-url=no}}More than one of <code style="color:inherit; border:inherit; padding:inherit;">&#x7C;work=</code> dan <code style="color:inherit; border:inherit; padding:inherit;">&#x7C;newspaper=</code> specified ([[Bantuan:CS1 errors#redundant parameters|bantuan]])</ref> pada tahun 2009 oleh Robert Griesemer, Rob Pike, dan [[Ken Thompson]].<ref name="langfaq">{{Cite web|url=http://golang.org/doc/go_faq.html|title=Language Design FAQ|date=16 January 2010|website=golang.org|access-date=27 February 2010|archive-date=2013-01-02|archive-url=https://web.archive.org/web/20130102205822/http://golang.org/doc/go_faq.html|dead-url=no}}</ref> Go adalah bahasa pemrograman [[sumber terbuka]] yang mudah, sederhana, efisien. Selain itu, Go memiliki level yang sama dengan Java. Yaitu bahasa pemrograman [[Kompilator|yang dihimpun]] dan diketik dalam bahasa [[C (bahasa pemrograman)|C]], dengan fitur [[Pengumpulan sampah (ilmu komputer)|pengumpulan sampah]], penulisan terstruktur, keamanan memori, dan pemrograman yang konkuren serta berurutan.<ref name="boldly">{{Cite web|url=https://www.theregister.co.uk/2011/05/05/google_go/|title=Google Go boldly goes where no code has gone before|last=Metz|first=Cade|date=5 May 2011|website=The Register|access-date=2018-03-14|archive-date=2019-09-28|archive-url=https://web.archive.org/web/20190928062338/https://www.theregister.co.uk/2011/05/05/google_go/|dead-url=no}}</ref> Kompiler dan IDE lainnya disediakan oleh [[Google]] dari awal secara [[Perangkat lunak bebas|bebas]] dan [[sumber terbuka]].<ref>{{Cite web |url=https://golang.org/LICENSE |title=Salinan arsip |access-date=2018-03-14 |archive-date=2021-11-01 |archive-url=https://web.archive.org/web/20211101212715/https://golang.org/LICENSE |dead-url=no }}</ref>


== Sejarah ==
== Sejarah ==
Bahasa diumumkan pada bulan November 2009. Hal ini digunakan dalam beberapa Google sistem produksi, serta dengan perusahaan lain.<ref name="faq">{{Cite news|url=http://golang.org/doc/faq#Is_Google_using_go_internally|title=Go FAQ: Is Google using Go internally?|access-date=2013-03-09}}</ref>
Golang dirilis perdana pada bulan November 2009. Golang telah digunakan di lingkungan produksi oleh Google dan perusahaan lain.<ref name="faq">{{Cite news|url=http://golang.org/doc/faq#Is_Google_using_go_internally|title=Go FAQ: Is Google using Go internally?|access-date=2013-03-09|archive-date=2019-01-07|archive-url=https://web.archive.org/web/20190107052512/https://golang.org/doc/faq#Is_Google_using_go_internally|dead-url=no}}</ref>


Dua  implementasi utama yang ada:
Dua implementasi utama yang ada:
* Google Go [[Kompilator|compiler]], "gc", yang dikembangkan sebagai [[Perangkat lunak sumber terbuka|perangkat lunak open-source]]. 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|smartphone]]).<ref>{{Cite web|url=https://www.wired.com/2015/08/googles-house-programming-language-now-runs-phones/|title=Google's In-House Programming Language Now Runs on Phones|date=19 August 2015|website=[[wired.com]]}}</ref>
* 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>{{Cite web|url=https://www.wired.com/2015/08/googles-house-programming-language-now-runs-phones/|title=Google's In-House Programming Language Now Runs on Phones|date=19 August 2015|website=[[wired.com]]|access-date=2018-03-14|archive-date=2021-09-18|archive-url=https://web.archive.org/web/20210918085642/https://www.wired.com/2015/08/googles-house-programming-language-now-runs-phones/|dead-url=no}}</ref>
* Kedua compiler, acpi, adalah GCC frontend.<ref>{{Cite web|url=http://golang.org/doc/go_faq.html#Implementation|title=FAQ: Implementation|date=16 January 2010|website=golang.org|access-date=2010-01-18}}</ref><ref>{{Cite web|url=https://gcc.gnu.org/install/configure.html|title=Installing GCC: Configuration|access-date=2011-12-03|quote=Ada, Go and Objective-C++ are not default languages}}</ref>
* Kedua compiler, acpi, adalah GCC frontend.<ref>{{Cite web|url=http://golang.org/doc/go_faq.html#Implementation|title=FAQ: Implementation|date=16 January 2010|website=golang.org|access-date=2010-01-18|archive-date=2013-01-02|archive-url=https://web.archive.org/web/20130102205822/http://golang.org/doc/go_faq.html#Implementation|dead-url=no}}</ref><ref>{{Cite web|url=https://gcc.gnu.org/install/configure.html|title=Installing GCC: Configuration|access-date=2011-12-03|quote=Ada, Go and Objective-C++ are not default languages|archive-date=2023-07-20|archive-url=https://web.archive.org/web/20230720215550/http://gcc.gnu.org/install/configure.html|dead-url=no}}</ref>
"Gc" toolchain telah self-hosting sejak versi 1.5.<ref>{{Cite web|url=https://golang.org/doc/go1.5#implementation|title=Go 1.5 Release Notes|access-date=28 January 2016|quote=The compiler and runtime are now implemented in Go and assembler, without C.}}</ref>
"Gc" toolchain telah ''self-hosting'' sejak versi 1.5.<ref>{{Cite web|url=https://golang.org/doc/go1.5#implementation|title=Go 1.5 Release Notes|access-date=28 January 2016|quote=The compiler and runtime are now implemented in Go and assembler, without C.|archive-date=2016-04-03|archive-url=https://web.archive.org/web/20160403232916/https://golang.org/doc/go1.5#implementation|dead-url=no}}</ref>


Go awalnya sebuah percobaan oleh para insinyur Google Robert Griesemer, Rob Pike, dan [[Ken Thompson]] untuk merancang sebuah bahasa pemrograman baru yang akan menyelesaikan kritik umum dari bahasa lain selama masih mempertahankan karakteristik positif . Pengembang dipertimbangkan bahasa baru seperti:<ref>{{Cite web|url=http://www.stanford.edu/class/ee380/Abstracts/100428.html|title=Another Go at Language Design|last=Pike|first=Rob|date=28 April 2010|website=Stanford EE Computer Systems Colloquium|publisher=[[Stanford University]]}} [https://www.youtube.com/watch?v=7VcArS4Wpqk Video available].</ref>
Go awalnya sebuah percobaan oleh para [[Rekayasawan|insinyur]] Google Robert Griesemer, Rob Pike, dan [[Ken Thompson]] untuk merancang sebuah bahasa pemrograman baru yang akan menyelesaikan kritik umum dari bahasa lain selama masih mempertahankan karakteristik positif. Pengembang dipertimbangkan bahasa baru seperti:<ref>{{Cite web|url=http://www.stanford.edu/class/ee380/Abstracts/100428.html|title=Another Go at Language Design|last=Pike|first=Rob|date=28 April 2010|website=Stanford EE Computer Systems Colloquium|publisher=[[Stanford University]]|access-date=2018-03-14|archive-date=2014-06-12|archive-url=https://web.archive.org/web/20140612224454/http://www.stanford.edu/class/ee380/Abstracts/100428.html|dead-url=no}} [https://www.youtube.com/watch?v=7VcArS4Wpqk Video available] {{Webarchive|url=https://web.archive.org/web/20161125090122/https://www.youtube.com/watch?v=7VcArS4Wpqk |date=2016-11-25 }}.</ref>
* diketik statis, scalable untuk sistem yang besar (seperti [[Java]] dan [[C++]])
* diketik statis, ''scalable'' untuk sistem yang besar (seperti [[Java]] dan [[C++]])
* produktif dan dapat dibaca, tanpa terlalu banyak kata kunci wajib dan pengulangan<ref>{{Cite web|url=https://golang.org/doc/faq#different_syntax|title=Frequently Asked Questions (FAQ) - The Go Programming Language|website=golang.org|access-date=2016-02-26}}</ref> ("light on the page" seperti [[Bahasa pemrograman dinamis|bahasa dinamis]])
* produktif dan dapat dibaca, tanpa terlalu banyak [[kata kunci]] wajib dan pengulangan<ref>{{Cite web|url=https://golang.org/doc/faq#different_syntax|title=Frequently Asked Questions (FAQ) - The Go Programming Language|website=golang.org|access-date=2016-02-26|archive-date=2017-05-03|archive-url=https://web.archive.org/web/20170503205801/https://golang.org/doc/faq#different_syntax|dead-url=no}}</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 desainer bahasa tidak suka terhadap kompleksitas C++'s  sehingga menjadi motivasi utama untuk mendesain sebuah bahasa baru.<ref>{{Cite web|url=http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480|title=Dr. Dobb's: Interview with Ken Thompson|last=Andrew Binstock|date=18 May 2011|access-date=2014-02-07}}</ref><ref>{{Cite web|url=http://commandcenter.blogspot.mx/2012/06/less-is-exponentially-more.html|title=Less is exponentially more|last=Pike|first=Rob|year=2012}}</ref><ref>{{Cite web|url=https://talks.golang.org/2015/gophercon-goevolution.slide#4|title=The Evolution of Go|last=Robert Griesemer|year=2015}}
Dalam wawancara terakhir, semua dari tiga perancang bahasa tidak suka terhadap kompleksitas C++ sehingga menjadi motivasi utama untuk mendesain sebuah bahasa baru.<ref>{{Cite web|url=http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480|title=Dr. Dobb's: Interview with Ken Thompson|last=Andrew Binstock|date=18 May 2011|access-date=2014-02-07|archive-date=2014-03-13|archive-url=https://web.archive.org/web/20140313072938/http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480|dead-url=no}}</ref><ref>{{Cite web|url=http://commandcenter.blogspot.mx/2012/06/less-is-exponentially-more.html|title=Less is exponentially more|last=Pike|first=Rob|year=2012|access-date=2018-03-14|archive-date=2016-03-21|archive-url=https://web.archive.org/web/20160321021201/http://commandcenter.blogspot.mx/2012/06/less-is-exponentially-more.html|dead-url=no}}</ref><ref>{{Cite web|url=https://talks.golang.org/2015/gophercon-goevolution.slide#4|title=The Evolution of Go|last=Robert Griesemer|year=2015|access-date=2018-03-14|archive-date=2017-01-16|archive-url=https://web.archive.org/web/20170116214316/https://talks.golang.org/2015/gophercon-goevolution.slide#4|dead-url=no}}</ref>

</ref>
Google merilis Go 1.0 pada bulan Maret 2012.<ref>{{Cite news|url=https://www.cnet.com/news/googles-go-language-turns-one-wins-a-spot-at-youtube/|title=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.|last=Shankland|first=Stephen|publisher=CBS Interactive Inc|department=News|publication-date=2012-03-30|quote=Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++.|access-date=2017-08-06|archive-date=2020-11-25|archive-url=https://web.archive.org/web/20201125062447/https://www.cnet.com/news/googles-go-language-turns-one-wins-a-spot-at-youtube/|dead-url=no}}</ref><ref>{{Cite web|url=https://golang.org/doc/devel/release.html|title=Release History|access-date=2018-03-14|archive-date=2017-02-17|archive-url=https://web.archive.org/web/20170217063007/https://golang.org/doc/devel/release.html|dead-url=no}}</ref>

===Versi===
Go 1 menjamin kompatibilitas<ref>{{Cite web|url=https://golang.org/doc/go1compat|title=Go 1 and the Future of Go Programs|website=golang.org|access-date=2022-10-10|archive-date=2017-10-02|archive-url=https://web.archive.org/web/20171002231014/https://golang.org/doc/go1compat|dead-url=no}}</ref> untuk spesifikasi bahasa dan bagian utama dari pustaka standar. Semua versi hingga perilisan Go 1.19 saat<ref>{{Cite web|title=Go 1.19 Release Notes|url=https://go.dev/doc/go1.19|url-status=live|website=go.dev|access-date=2022-10-10|archive-date=2023-05-29|archive-url=https://web.archive.org/web/20230529021715/https://go.dev/doc/go1.19|dead-url=no}}</ref> telah menepati janji ini.


Setiap perilisan utama Go didukung hingga ada dua perilisan utama yang lebih baru.<ref>{{Cite web|url=https://golang.org/doc/devel/release.html#policy|title=Release History|website=golang.org|access-date=2022-10-10|archive-date=2017-02-17|archive-url=https://web.archive.org/web/20170217063007/https://golang.org/doc/devel/release.html#policy|dead-url=no}}</ref>
Google merilis Go 1.0 pada bulan Maret 2012.<ref>{{Cite news|url=https://www.cnet.com/news/googles-go-language-turns-one-wins-a-spot-at-youtube/|title=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.|last=Shankland|first=Stephen|publisher=CBS Interactive Inc|department=News|publication-date=2012-03-30|quote=Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++.|access-date=2017-08-06}}
</ref><ref>{{Cite web|url=https://golang.org/doc/devel/release.html|title=Release History}}
</ref>


{| class="wikitable sortable right"
!Perilisan
!Status
!Tanggal perilisan
!Akhir pemeliharaan
|-
| {{Version|o|go1}}
| {{Version|o|Kadaluwarsa}}
| 2012-03-28
| 2013-12-01
|-
| {{Version|o|go1.1}}
| {{Version|o|Kadaluwarsa}}
| 2013-05-13
| 2014-06-18
|-
| {{Version|o|go1.2}}
| {{Version|o|Kadaluwarsa}}
| 2013-12-01
| 2014-12-10
|-
| {{Version|o|go1.3}}
| {{Version|o|Kadaluwarsa}}
| 2014-06-18
| 2015-08-19
|-
| {{Version|o|go1.4}}
| {{Version|o|Kadaluwarsa}}
| 2014-12-10
| 2016-02-17
|-
| {{Version|o|go1.5}}
| {{Version|o|Kadaluwarsa}}
| 2015-08-19
| 2016-08-15
|-
| {{Version|o|go1.6}}
| {{Version|o|Kadaluwarsa}}
| 2016-02-17
| 2017-02-16
|-
| {{Version|o|go1.7}}
| {{Version|o|Kadaluwarsa}}
| 2016-08-15
| 2017-08-24
|-
| {{Version|o|go1.8}}
| {{Version|o|Kadaluwarsa}}
| 2017-02-16
| 2018-02-16
|-
| {{Version|o|go1.9}}
| {{Version|o|Kadaluwarsa}}
| 2017-08-24
| 2018-08-24
|-
| {{Version|o|go1.10}}
| {{Version|o|Kadaluwarsa}}
| 2018-02-16
| 2019-02-25
|-
| {{Version|o|go1.11}}
| {{Version|o|Kadaluwarsa}}
| 2018-08-24
| 2019-09-03
|-
| {{Version|o|go1.12}}
| {{Version|o|Kadaluwarsa}}
| 2019-02-25
| 2020-02-25
|-
| {{Version|o|go1.13}}
| {{Version|o|Kadaluwarsa}}
| 2019-09-03
| 2020-08-11
|-
| {{Version|o|go1.14}}
| {{Version|o|Kadaluwarsa}}
| 2020-02-25
| 2021-02-16
|-
| {{Version|o|go1.15}}
| {{Version|o|Kadaluwarsa}}
| 2020-08-11
| 2021-08-16
|-
| {{Version|o|go1.16}}
| {{Version|o|Kadaluwarsa}}
| 2021-02-16
| 2022-03-15
|-
| {{Version|o|go1.17}}
| {{Version|o|Kadaluwarsa}}
| 2021-08-16
| 2022-08-02
|-
| {{Version|co|go1.18|show=}}
| {{Version|co|Pemeliharaan|show=}}
| 2022-03-15
| Q1 2023
|-
| {{Version|c|go1.19}}
| {{Version|c|Saat ini}}
| 2022-08-02
| Q3 2023
|-
| {{Version|p|go1.20}}
| {{Version|p|Direncanakan}}
| Q1 2023
| Q1 2024
|-
| colspan="4" | <small>{{Version |l |show=111101}}</small>
|}
== Desain Bahasa ==
== Desain Bahasa ==
Go lebih dikenali dalam tradisi [[C (bahasa pemrograman)|C]], tapi membuat banyak perubahan untuk meningkatkan singkatnya, kesederhanaan, dan keamanan. Go terdiri dari:
Go lebih dikenali dalam tradisi [[C (bahasa pemrograman)|C]], tapi membuat banyak perubahan untuk meningkatkan singkatnya, kesederhanaan, dan keamanan. Go terdiri dari:
* Sintaks dan lingkungan mengadopsi pola-pola yang lebih umum dalam [[Bahasa pemrograman dinamis|bahasa dinamis]]:<ref name="go_lang_video_2009">{{Cite web|url=https://www.youtube.com/watch?v=rKnDgT73v8s&feature=related|title=The Go Programming Language|last=Pike|first=Rob|publisher=YouTube|access-date=2011-07-01}}</ref>
* Sintaks dan lingkungan mengadopsi pola-pola yang lebih umum dalam [[Bahasa pemrograman dinamis|bahasa dinamis]]:<ref name="go_lang_video_2009">{{Cite web|url=https://www.youtube.com/watch?v=rKnDgT73v8s&feature=related|title=The Go Programming Language|last=Pike|first=Rob|publisher=YouTube|access-date=2011-07-01|archive-date=2013-02-11|archive-url=https://web.archive.org/web/20130211163704/http://www.youtube.com/watch?v=rKnDgT73v8s&feature=related|dead-url=no}}</ref>
** Opsional ringkas variabel deklarasi dan inisialisasi melalui jenis inferensi (<code>x<span> </span>:= 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<span> </span>:= 0</code> tidak <code>int x = 0;</code> atau <code>var x = 0;</code>).
** Kompilasi cepat.<ref name="techtalk-compiling">{{Cite video}}</ref>
** Kompilasi cepat.<ref name="techtalk-compiling">{{Cite video}}</ref>
** Remote manajemen paket (<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 online.<ref>{{Cite web|url=http://godoc.org|title=GoDoc|website=godoc.org}}</ref>
** Remote manajemen paket (<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] {{Webarchive|url=https://web.archive.org/web/20170312183728/https://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies |date=2017-03-12 }}; see [http://godoc.org godoc.org] {{Webarchive|url=https://web.archive.org/web/20201007185216/https://godoc.org/ |date=2020-10-07 }} for addresses and documentation of some packages</ref> dan paket dokumentasi daring.<ref>{{Cite web|url=http://godoc.org/|title=GoDoc|website=godoc.org|access-date=2018-03-14|archive-date=2020-10-07|archive-url=https://web.archive.org/web/20201007185216/https://godoc.org/|dead-url=no}}</ref>
* Khas pendekatan untuk masalah tertentu:
* Khas pendekatan untuk masalah tertentu:
** Built-in concurrency primitif: proses ringan (goroutines), saluran, dan yang <code>memilih</code> pernyataan.
** Built-in concurrency primitif: proses ringan (goroutines), 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 statis terkait binari asli tanpa dependensi eksternal.
** Sebuah toolchain yang, secara default, menghasilkan statis terkait binari asli tanpa dependensi eksternal.
* Keinginan untuk menjaga bahasa spesifikasi yang cukup sederhana untuk memegang di sebuah programmer kepala,<ref>Rob Pike, on [http://5by5.tv/changelog/100 The Changelog] podcast</ref> di bagian dengan menghilangkan fitur-fitur umum untuk bahasa yang sama.
* Keinginan untuk menjaga bahasa spesifikasi yang cukup sederhana untuk memegang di sebuah programmer kepala,<ref>Rob Pike, on [http://5by5.tv/changelog/100 The Changelog] {{Webarchive|url=https://web.archive.org/web/20131020101046/http://5by5.tv/changelog/100 |date=2013-10-20 }} podcast</ref> di bagian dengan menghilangkan fitur-fitur umum untuk bahasa yang sama.


=== Sintaks ===
=== Sintaks ===
Sintaks Go meliputi perubahan dari C bertujuan menjaga kode ringkas dan mudah dibaca. Gabungan deklarasi/inisialisasi operator diperkenalkan yang memungkinkan programmer untuk menulis <code>saya<span> </span>:= 3</code> atau <code>s<span> </span>:= "Hello, world!"</code>, tanpa menentukan jenis variabel. Ini kontras dengan C <code>int i = 3;</code> dan <code>const char *s = "Hello, world!";</code>. Titik koma masih menghentikan pernyataan, tetapi secara implisit ketika akhir baris yang terjadi. Fungsi dapat mengembalikan beberapa nilai-nilai, dan mengembalikan <code>result, err</code> pasangan adalah cara konvensional yang berfungsi menunjukkan kesalahan untuk penelepon di Go.{{Efn|Usually, exactly one of the result and error values has a value other than the type's zero value; sometimes both do, as when a read or write can only be partially completed, and sometimes neither, as when a read returns 0 bytes. See [[Semipredicate problem#Multivalued return|Semipredicate problem: Multivalued return]].}} Go menambahkan sintaks literal untuk menginisialisasi struct parameter dengan nama, dan untuk inisialisasi peta dan irisan. Sebagai alternatif untuk C tiga pernyataan <code>for</code> loop, Ekspresi Go <code>range</code>  memungkinkan ringkas iterasi lebih dari array, irisan, string, peta, dan saluran.{{Butuh rujukan|date=December 2016}}
Sintaks Go meliputi perubahan dari C bertujuan menjaga kode ringkas dan mudah dibaca. Gabungan deklarasi/inisialisasi operator diperkenalkan yang memungkinkan programmer untuk menulis <code>saya<span> </span>:= 3</code> atau <code>s<span> </span>:= "Hello, world!"</code>, tanpa menentukan jenis variabel. Ini kontras dengan C <code>int i = 3;</code> dan <code>const char *s = "Hello, world!";</code>. Titik koma masih menghentikan pernyataan, tetapi secara implisit ketika akhir baris yang terjadi. Fungsi dapat mengembalikan beberapa nilai-nilai, dan mengembalikan <code>result, err</code> pasangan adalah cara konvensional yang berfungsi menunjukkan kesalahan untuk penelepon di Go.{{Efn|Usually, exactly one of the result and error values has a value other than the type's zero value; sometimes both do, as when a read or write can only be partially completed, and sometimes neither, as when a read returns 0 bytes. See [[Semipredicate problem#Multivalued return|Semipredicate problem: Multivalued return]].}} Go menambahkan sintaks literal untuk menginisialisasi struct parameter dengan nama, dan untuk inisialisasi peta dan irisan. Sebagai alternatif untuk C tiga pernyataan <code>for</code> loop, Ekspresi Go <code>range</code> memungkinkan ringkas iterasi lebih dari array, irisan, string, peta, dan saluran.{{Butuh rujukan|date=December 2016}}


=== Jenis (Tipe Data) ===
=== Jenis (Tipe Data) ===
Go memiliki sejumlah built-in tipe data, 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.<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.{{Butuh rujukan|date=December 2016}}
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.<ref>Rob Pike, [http://blog.golang.org/strings Strings, bytes, runes and characters in Go] {{Webarchive|url=https://web.archive.org/web/20150103213441/http://blog.golang.org/strings |date=2015-01-03 }}, 23 October 2013</ref> [[Record|jenis Catatan]] dapat didefinisikan dengan kata kunci struct.{{Butuh rujukan|date=December 2016}}


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.{{r|append}}<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>
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.{{r|append}}<ref>Andrew Gerrand, [http://blog.golang.org/go-slices-usage-and-internals Go Slices: usage and internals] {{Webarchive|url=https://web.archive.org/web/20150107025801/http://blog.golang.org/go-slices-usage-and-internals |date=2015-01-07 }}</ref><ref>The Go Authors, [http://golang.org/doc/effective_go.html#slices Effective Go: Slices] {{Webarchive|url=https://web.archive.org/web/20210209204944/http://golang.org/doc/effective_go.html#slices |date=2021-02-09 }}</ref>


Petunjuk tersedia untuk semua type, dan pointer-ke-''T'' jenis dilambangkan *''T''. Alamat-mengambil dan tipuan gunakan &#x26; 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 pointer aritmetika, kecuali melalui khusus jenis unsafe.Pointer di perpustakaan standar.{{Butuh rujukan|date=December 2016}}
Petunjuk tersedia untuk semua type, dan pointer-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] {{Webarchive|url=https://web.archive.org/web/20210513024511/https://golang.org/ref/spec#Selectors |date=2021-05-13 }} and [https://golang.org/ref/spec#Calls Calls - The Go Programming Language Specification] {{Webarchive|url=https://web.archive.org/web/20210513024511/https://golang.org/ref/spec#Calls |date=2021-05-13 }}</ref> tidak Ada pointer aritmetika, kecuali melalui khusus jenis unsafe.Pointer di perpustakaan standar.{{Butuh rujukan|date=December 2016}}


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.{{Butuh rujukan|date=December 2016}}
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.{{Butuh rujukan|date=December 2016}}


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) pra-didefinisikan dan menambahkan jenis baru dapat menentukan konversi tambahan, tapi konversi antara nama jenis harus selalu dipanggil secara eksplisit.<ref>{{Cite web|url=http://golang.org/ref/spec#Assignability|title=The Go Programming Language Specification|website=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.{{Butuh rujukan|date=December 2016}}<syntaxhighlight />Dengan jenis definisi tersebut, ipv4addr(x) menafsirkan uint32 nilai x sebagai alamat IP. Dengan menginisiasi x untuk variabel jenis ipv4addr adalah kesalahan tipe.{{Butuh rujukan|date=December 2016}}
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) pra-didefinisikan dan menambahkan jenis baru dapat menentukan konversi tambahan, tapi konversi antara nama jenis harus selalu dipanggil secara eksplisit.<ref>{{Cite web|url=http://golang.org/ref/spec#Assignability|title=The Go Programming Language Specification|website=golang.org|access-date=2018-03-14|archive-date=2021-03-18|archive-url=https://web.archive.org/web/20210318133416/http://golang.org/ref/spec#Assignability|dead-url=no}}</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.{{Butuh rujukan|date=December 2016}}


Dengan jenis definisi tersebut, ipv4addr(x) menafsirkan uint32 nilai x sebagai alamat IP. Dengan menginisiasi x untuk variabel jenis ipv4addr adalah kesalahan tipe.{{Butuh rujukan|date=December 2016}}
Ekspresi konstan dapat berupa diketik atau "untyped"; mereka diberi jenis ketika ditugaskan untuk mengetik variabel jika nilai mereka mewakili melewati waktu kompilasi cek.<ref>{{Cite web|url=http://golang.org/ref/spec#Constants|title=The Go Programming Language Specification|website=golang.org}}</ref>


Ekspresi konstan dapat berupa diketik atau "untyped"; mereka diberi jenis ketika ditugaskan untuk mengetik variabel jika nilai mereka mewakili melewati waktu kompilasi cek.<ref>{{Cite web|url=http://golang.org/ref/spec#Constants|title=The Go Programming Language Specification|website=golang.org|access-date=2018-03-14|archive-date=2021-03-18|archive-url=https://web.archive.org/web/20210318133416/http://golang.org/ref/spec#Constants|dead-url=no}}</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.{{Butuh rujukan|date=December 2016}}


[[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.{{Butuh rujukan|date=December 2016}}
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.<syntaxhighlight />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>{{Cite web|url=http://golang.org/ref/spec#Calls|title=The Go Programming Language Specification|website=golang.org}}</ref>

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>{{Cite web|url=http://golang.org/ref/spec#Calls|title=The Go Programming Language Specification|website=golang.org|access-date=2018-03-14|archive-date=2021-03-18|archive-url=https://web.archive.org/web/20210318133416/http://golang.org/ref/spec#Calls|dead-url=no}}</ref>


==== {{Anchor|Interfaces}} Sistem antarmuka ====
==== {{Anchor|Interfaces}} Sistem antarmuka ====
Baris 59: Baris 197:
Yang pertama adalah ''embedding'', yang dapat dilihat sebagai bentuk otomatis dari komposisi{{r|gohotdraw}} atau delegasi.<ref name="summerfield">{{Cite book|title=Programming in Go: Creating Applications for the 21st Century|last=Summerfield|first=Mark|publisher=Addison-Wesley|year=2012}}</ref><sup>:255</sup>
Yang pertama adalah ''embedding'', yang dapat dilihat sebagai bentuk otomatis dari komposisi{{r|gohotdraw}} atau delegasi.<ref name="summerfield">{{Cite book|title=Programming in Go: Creating Applications for the 21st Century|last=Summerfield|first=Mark|publisher=Addison-Wesley|year=2012}}</ref><sup>:255</sup>


Yang kedua adalah ''antarmuka'', yang menyediakan runtime polimorfisme.<ref name="balbaert">{{Cite book|title=The Way to Go: A Thorough Introduction to the Go Programming Language|last=Balbaert|first=Ivo|publisher=iUniverse|year=2012}}</ref><sup>:266</sup> menyediakan Antarmuka yang terbatas bentuk struktural mengetik di sebaliknya nominal jenis sistem Go. Setiap jenis yang mengimplementasikan semua metode dari interface sesuai dengan antarmuka yang. Antarmuka Go yang dirancang setelah protokol dari bahasa pemrograman Smalltalk.<ref>{{Cite web|url=https://talks.golang.org/2015/gophercon-goevolution.slide#19|title=The Evolution of Go|website=talks.golang.org|access-date=2016-03-13}}</ref> Beberapa sumber yang menggunakan istilah bebek mengetik ketika menggambarkan Go antarmuka.<ref>{{Cite web|url=http://www.drdobbs.com/architecture-and-design/duck-typing-and-the-go-programming-langu/228701527|title=Duck Typing and the Go Programming Language|last=Diggins|first=Christopher|date=2009-11-24|publisher=[[Dr. Dobb's Journal|Dr. Dobb's]]|access-date=2016-03-10}}</ref><ref>{{Cite web|url=https://medium.com/@matryer/golang-advent-calendar-day-one-duck-typing-a513aaed544d#.ebm7j81xu|title=Duck typing in Go|last=Ryer|first=Mat|date=2015-12-01|access-date=2016-03-10}}</ref> Meskipun istilah bebek mengetik tidak tepat didefinisikan dan oleh karena itu tidak salah, itu biasanya berarti bahwa kesesuaian jenis ini tidak statis diperiksa. Sejak kesesuaian untuk Go dengan antarmuka yang diperiksa..... dengan Go compiler (kecuali ketika melakukan pernyataan jenis), penulis Go lebih suka menggunakan istilah ''pengetikan'' ''struktural''.{{Butuh rujukan|date=December 2016}}
Yang kedua adalah ''antarmuka'', yang menyediakan runtime polimorfisme.<ref name="balbaert">{{Cite book|title=The Way to Go: A Thorough Introduction to the Go Programming Language|last=Balbaert|first=Ivo|publisher=iUniverse|year=2012}}</ref><sup>:266</sup> menyediakan Antarmuka yang terbatas bentuk struktural mengetik di sebaliknya nominal jenis sistem Go. Setiap jenis yang mengimplementasikan semua metode dari interface sesuai dengan antarmuka yang. Antarmuka Go yang dirancang setelah protokol dari bahasa pemrograman Smalltalk.<ref>{{Cite web|url=https://talks.golang.org/2015/gophercon-goevolution.slide#19|title=The Evolution of Go|website=talks.golang.org|access-date=2016-03-13|archive-date=2017-01-16|archive-url=https://web.archive.org/web/20170116214316/https://talks.golang.org/2015/gophercon-goevolution.slide#19|dead-url=no}}</ref> Beberapa sumber yang menggunakan istilah bebek mengetik ketika menggambarkan Go antarmuka.<ref>{{Cite web|url=http://www.drdobbs.com/architecture-and-design/duck-typing-and-the-go-programming-langu/228701527|title=Duck Typing and the Go Programming Language|last=Diggins|first=Christopher|date=2009-11-24|publisher=[[Dr. Dobb's Journal|Dr. Dobb's]]|access-date=2016-03-10|archive-date=2020-08-07|archive-url=https://web.archive.org/web/20200807235429/https://www.drdobbs.com/architecture-and-design/duck-typing-and-the-go-programming-langu/228701527|dead-url=no}}</ref><ref>{{Cite web|url=https://medium.com/@matryer/golang-advent-calendar-day-one-duck-typing-a513aaed544d#.ebm7j81xu|title=Duck typing in Go|last=Ryer|first=Mat|date=2015-12-01|access-date=2016-03-10|archive-date=2023-06-09|archive-url=https://web.archive.org/web/20230609124944/https://medium.com/@matryer/golang-advent-calendar-day-one-duck-typing-a513aaed544d#.ebm7j81xu|dead-url=no}}</ref> Meskipun istilah bebek mengetik tidak tepat didefinisikan dan oleh karena itu tidak salah, itu biasanya berarti bahwa kesesuaian jenis ini tidak statis diperiksa. Sejak kesesuaian untuk Go dengan antarmuka yang diperiksa..... dengan Go compiler (kecuali ketika melakukan pernyataan jenis), penulis Go lebih suka menggunakan istilah ''pengetikan'' ''struktural''.{{Butuh rujukan|date=December 2016}}


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:<syntaxhighlight />Kedua Square dan Circle yang secara implisit Shape dan dapat ditugaskan untuk Shape-diketik variabel.{{r|balbaert}}<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.{{r|balbaert}}<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.{{r|balbaert}}<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.{{r|balbaert}}<sup>:270</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.{{r|balbaert}}<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.{{r|balbaert}}<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'',<ref>{{Cite web|url=http://golang.org/ref/spec#Type_assertions|title=The Go Programming Language Specification|website=golang.org}}</ref> yang memeriksa terhadap satu potensi jenis, dan ''jenis switch'',<ref>{{Cite web|url=http://golang.org/ref/spec#Type_switches|title=The Go Programming Language Specification|website=golang.org}}</ref> yang memeriksa terhadap beberapa jenis.{{Butuh rujukan|date=December 2016}}
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>{{Cite web|url=http://golang.org/ref/spec#Type_assertions|title=The Go Programming Language Specification|website=golang.org|access-date=2018-03-14|archive-date=2021-03-18|archive-url=https://web.archive.org/web/20210318133416/http://golang.org/ref/spec#Type_assertions|dead-url=no}}</ref> yang memeriksa terhadap satu potensi jenis, dan ''jenis switch'',<ref>{{Cite web|url=http://golang.org/ref/spec#Type_switches|title=The Go Programming Language Specification|website=golang.org|access-date=2018-03-14|archive-date=2021-03-18|archive-url=https://web.archive.org/web/20210318133416/http://golang.org/ref/spec#Type_switches|dead-url=no}}</ref> yang memeriksa terhadap beberapa jenis.{{Butuh rujukan|date=December 2016}}


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.{{r|balbaert}}<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 <code>interface{}</code> to a <code>reflect.Value</code> 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.{{Butuh rujukan|date=December 2016}}
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.{{r|balbaert}}<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{})] {{Webarchive|url=https://web.archive.org/web/20210703151158/https://golang.org/pkg/reflect/#ValueOf |date=2021-07-03 }} converts an <code>interface{}</code> to a <code>reflect.Value</code> 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.{{Butuh rujukan|date=December 2016}}


Antarmuka nilai-nilai yang diimplementasikan dengan menggunakan pointer ke data dan pointer ke run-time jenis informasi.<ref>{{Cite web|url=http://research.swtch.com/interfaces|title=Go Data Structures: Interfaces|access-date=15 November 2012}}</ref> Seperti beberapa jenis lain diimplementasikan dengan menggunakan pointer pada Go, antarmuka nilai-nilai <code>nihil</code> jika tidak terinisialisasi.<ref>{{Cite web|url=http://golang.org/ref/spec#Interface_types|title=The Go Programming Language Specification|website=golang.org}}</ref>
Antarmuka nilai-nilai yang diimplementasikan dengan menggunakan pointer ke data dan pointer ke run-time jenis informasi.<ref>{{Cite web|url=http://research.swtch.com/interfaces|title=Go Data Structures: Interfaces|access-date=15 November 2012|archive-date=2023-07-08|archive-url=https://web.archive.org/web/20230708065858/https://research.swtch.com/interfaces|dead-url=no}}</ref> Seperti beberapa jenis lain diimplementasikan dengan menggunakan pointer pada Go, antarmuka nilai-nilai <code>nihil</code> jika tidak terinisialisasi.<ref>{{Cite web|url=http://golang.org/ref/spec#Interface_types|title=The Go Programming Language Specification|website=golang.org|access-date=2018-03-14|archive-date=2021-03-18|archive-url=https://web.archive.org/web/20210318133416/http://golang.org/ref/spec#Interface_types|dead-url=no}}</ref>


=== Sistem paket ===
=== Sistem paket ===
Dalam Kunjungan itu sistem paket, setiap paket memiliki jalan (misalnya, <code>"kompres/bzip2"</code> atau <code>"golang.org/x/net/html"</code>) dan nama (misalnya, <code>bzip2</code> atau <code>html</code>). Referensi lain paket' definisi harus ''selalu'' menjadi diawali dengan paket lain nama, dan hanya ''bermodal'' nama dari paket-paket yang lain dapat diakses: <code>io.</code><code>Pembaca</code> umum tapi <code>bzip2.pembaca</code> tidak.<ref>{{Cite web|url=http://golang.org/doc/go_tutorial.html|title=A Tutorial for the Go Programming Language|website=The Go Programming Language|publisher=Google|access-date=10 March 2013|quote=In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared.}}</ref> Perintah <code>go get</code> dapat mengambil paket yang disimpan dalam repositori jauh seperti [[GitHub]],<ref>{{Cite web|url=http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies|title=go - The Go Programming Language|website=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>{{Cite web|url=https://golang.org/doc/code.html|title=How to Write Go Code|website=golang.org|quote=The packages from the standard library are given short import paths such as "fmt" and "net/http". For your own packages, you must choose a base path that is unlikely to collide with future additions to the standard library or other external libraries. If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path. For instance, if you have a GitHub account at github.com/user, that should be your base path}}</ref>
Dalam Kunjungan itu sistem paket, setiap paket memiliki jalan (misalnya, <code>"kompres/bzip2"</code> atau <code>"golang.org/x/net/html"</code>) dan nama (misalnya, <code>bzip2</code> atau <code>html</code>). Referensi lain paket' definisi harus ''selalu'' menjadi diawali dengan paket lain nama, dan hanya ''bermodal'' nama dari paket-paket yang lain dapat diakses: <code>io.</code><code>Pembaca</code> umum tapi <code>bzip2.pembaca</code> tidak.<ref>{{Cite web|url=http://golang.org/doc/go_tutorial.html|title=A Tutorial for the Go Programming Language|website=The Go Programming Language|publisher=Google|access-date=10 March 2013|quote=In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared.|archive-date=2013-07-09|archive-url=https://web.archive.org/web/20130709050415/http://tour.golang.org/|dead-url=no}}</ref> Perintah <code>go get</code> dapat mengambil paket yang disimpan dalam repositori jauh seperti [[GitHub]],<ref>{{Cite web|url=http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies|title=go - The Go Programming Language|website=golang.org|access-date=2018-03-14|archive-date=2017-03-12|archive-url=https://web.archive.org/web/20170312183728/https://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies|dead-url=no}}</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>{{Cite web|url=https://golang.org/doc/code.html|title=How to Write Go Code|website=golang.org|quote=The packages from the standard library are given short import paths such as "fmt" and "net/http". For your own packages, you must choose a base path that is unlikely to collide with future additions to the standard library or other external libraries. If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path. For instance, if you have a GitHub account at github.com/user, that should be your base path|access-date=2018-03-14|archive-date=2019-02-13|archive-url=https://web.archive.org/web/20190213155415/https://golang.org/doc/code.html|dead-url=no}}</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.<ref>{{Cite web|url=https://docs.google.com/document/d/18tNd8r5DV0yluCR7tPvkMTsWD_lYcRO7NhpNSDymRr8/edit?pref=2&pli=1|title=Go Packaging Proposal Process}}</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.<ref>{{Cite web|url=https://docs.google.com/document/d/18tNd8r5DV0yluCR7tPvkMTsWD_lYcRO7NhpNSDymRr8/edit?pref=2&pli=1|title=Go Packaging Proposal Process|access-date=2018-03-14|archive-date=2022-04-09|archive-url=https://web.archive.org/web/20220409131021/https://docs.google.com/document/d/18tNd8r5DV0yluCR7tPvkMTsWD_lYcRO7NhpNSDymRr8/edit?pref=2&pli=1|dead-url=no}}</ref>


=== {{Anchor|Concurrency}} Concurrency: goroutines dan saluran ===
=== {{Anchor|Concurrency}} Concurrency: goroutines dan saluran ===
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.<ref name="concurrency-is-not">Rob Pike, [http://vimeo.com/49718712 Concurrency is not Parallelism]</ref>
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.<ref name="concurrency-is-not">Rob Pike, [http://vimeo.com/49718712 Concurrency is not Parallelism] {{Webarchive|url=https://web.archive.org/web/20230709023724/https://vimeo.com/49718712 |date=2023-07-09 }}</ref>


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 [[Utas (komputer)|sistem operasi benang]], mirip dengan penjadwalan yang dilakukan dalam Erlang.{{r|phrasebook}}<sup>:10</sup>
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 [[Utas (komputer)|sistem operasi benang]], mirip dengan penjadwalan yang dilakukan dalam Erlang.{{r|phrasebook}}<sup>:10</sup>


Sementara standar perpustakaan menampilkan paket yang paling klasik concurrency control struktur (mutex kunci, dll.) tersedia,{{r|phrasebook}}<sup>:151–152</sup> idiomatik bersamaan program bukan sukai ''saluran'', yang memberikan mengirim pesan antara goroutines.<ref>{{Cite web|url=http://golang.org/doc/effective_go.html#sharing|title=Effective Go|website=golang.org}}</ref> Opsional buffer menyimpan pesan di [[FIFO]] order{{r|summerfield}}<sup>:43</sup> dan memungkinkan mengirim goroutines untuk melanjutkan sebelum mereka menerima pesan.{{Butuh rujukan|date=December 2016}}
Sementara standar perpustakaan menampilkan paket yang paling klasik concurrency control struktur (mutex kunci, dll.) tersedia,{{r|phrasebook}}<sup>:151–152</sup> idiomatik bersamaan program bukan sukai ''saluran'', yang memberikan mengirim pesan antara goroutines.<ref>{{Cite web|url=http://golang.org/doc/effective_go.html#sharing|title=Effective Go|website=golang.org|access-date=2018-03-14|archive-date=2021-02-09|archive-url=https://web.archive.org/web/20210209204944/http://golang.org/doc/effective_go.html#sharing|dead-url=no}}</ref> Opsional buffer menyimpan pesan di [[FIFO]] order{{r|summerfield}}<sup>:43</sup> dan memungkinkan mengirim goroutines untuk melanjutkan sebelum mereka menerima pesan.{{Butuh rujukan|date=December 2016}}


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>{{Cite web|url=http://golang.org/ref/mem|title=The Go Memory Model|access-date=10 April 2017}}</ref>
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>{{Cite web|url=http://golang.org/ref/mem|title=The Go Memory Model|access-date=10 April 2017|archive-date=2021-11-16|archive-url=https://web.archive.org/web/20211116055227/https://golang.org/ref/mem|dead-url=no}}</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.{{r|phrasebook}}<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.{{r|phrasebook}}<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.<ref>{{Cite web|url=http://talks.golang.org/2012/concurrency.slide|title=Go Concurrency Patterns|website=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>
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>{{Cite web|url=http://talks.golang.org/2012/concurrency.slide|title=Go Concurrency Patterns|website=golang.org|access-date=2018-03-14|archive-date=2021-02-05|archive-url=https://web.archive.org/web/20210205062324/https://talks.golang.org/2012/concurrency.slide|dead-url=no}}</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] {{Webarchive|url=https://web.archive.org/web/20131014175745/http://blog.cloudflare.com/recycling-memory-buffers-in-go |date=2013-10-14 }}</ref> pelaksana coroutines (yang membantu menginspirasi nama ''goroutine''),<ref>{{Cite web |url=http://golang.org/doc/play/tree.go |title=tree.go |access-date=2018-03-14 |archive-date=2021-10-26 |archive-url=https://web.archive.org/web/20211026084128/https://golang.org/doc/play/tree.go |dead-url=no }}</ref> dan menerapkan iterator.<ref>Ewen Cheslack-Postava, [http://ewencp.org/blog/golang-iterators/ Iterators in Go] {{Webarchive|url=https://web.archive.org/web/20230708182835/https://ewencp.org/blog/golang-iterators/ |date=2023-07-08 }}</ref>


Concurrency-struktural terkait konvensi 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 name="memmodel">{{Cite web|url=http://golang.org/doc/go_mem.html|title=The Go Memory Model|publisher=Google|access-date=5 January 2011}}</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 {{Section link|2=Lack of race condition safety}}, di bawah ini.{{Butuh rujukan|date=December 2016}}
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] {{Webarchive|url=https://web.archive.org/web/20230720213917/https://www.vitanuova.com/inferno/papers/descent.html |date=2023-07-20 }}</ref> Go tidak menyediakan built-in gagasan aman atau diverifikasi concurrency.<ref name="memmodel">{{Cite web|url=http://golang.org/doc/go_mem.html|title=The Go Memory Model|publisher=Google|access-date=5 January 2011|archive-date=2010-11-23|archive-url=https://web.archive.org/web/20101123011223/http://golang.org/doc/go_mem.html|dead-url=no}}</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 {{Section link|2=Lack of race condition safety}}, di bawah ini.{{Butuh rujukan|date=December 2016}}


==== Kesesuaian untuk pemrograman paralel ====
==== Kesesuaian untuk pemrograman paralel ====
Meskipun Go concurrency fitur yang tidak ditujukan terutama untuk [[Komputasi paralel|pemrosesan paralel]],{{r|concurrency-is-not}} mereka dapat digunakan untuk program memori bersama [[Multipengolahan|multi-prosesor]] mesin. Berbagai studi telah dilakukan untuk keefektifan pendekatan ini.<ref>{{Cite conference}}</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 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>{{Cite conference}}</ref>
Meskipun ''Go concurrency'' fitur yang tidak ditujukan terutama untuk [[Komputasi paralel|pemrosesan paralel]],{{r|concurrency-is-not}} mereka dapat digunakan untuk program memori bersama [[Multipengolahan|multi-prosesor]] mesin. Berbagai studi telah dilakukan untuk keefektifan pendekatan ini.<ref name="Cite conference">{{Cite conference}}</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 name="Cite conference"/>


==== 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.<ref>Russ Cox, [http://research.swtch.com/gorace Off to the Races]</ref><ref name="SPLASH2012">{{Cite web|url=http://talks.golang.org/2012/splash.article|title=Go at Google: Language Design in the Service of Software Engineering|last=Pike|first=Rob|authorlink=Rob Pike|date=October 25, 2012|publisher=Google, Inc.}} "There is one important caveat: Go is not purely memory safe in the presence of concurrency."</ref>
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] {{Webarchive|url=https://web.archive.org/web/20230708182813/https://research.swtch.com/gorace |date=2023-07-08 }}</ref><ref name="SPLASH2012">{{Cite web|url=http://talks.golang.org/2012/splash.article|title=Go at Google: Language Design in the Service of Software Engineering|last=Pike|first=Rob|authorlink=Rob Pike|date=October 25, 2012|publisher=Google, Inc.|access-date=2018-03-14|archive-date=2022-07-06|archive-url=https://web.archive.org/web/20220706041511/https://talks.golang.org/2012/splash.article|dead-url=no}} "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 pointer) melalui saluran sinyal yang mentransfer kepemilikan atas nilai kepada penerima.{{r|phrasebook}}<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 pointer) melalui saluran sinyal yang mentransfer kepemilikan atas nilai kepada penerima.{{r|phrasebook}}<sup>:155</sup>
Baris 104: Baris 242:
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.<ref name="langfaq"></sup>}} 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 name="gohotdraw">{{Cite conference}}</ref>
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.<ref name="langfaq"></sup>}} 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 name="gohotdraw">{{Cite conference}}</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 name="append">{{Cite web|url=http://blog.golang.org/slices|title=Arrays, slices (and strings): The mechanics of 'append'|last=Pike|first=Rob|date=26 September 2013|website=The Go Blog|access-date=7 March 2015}}</ref> tim Google yang dirancang bahasa dibangun setidaknya satu compiler untuk eksperimental dialek Go secara umum, tapi tidak merilisnya.<ref>{{Cite web|url=http://channel9.msdn.com/Blogs/Charles/Erik-Meijer-and-Robert-Griesemer-Go|title=E2E: Erik Meijer and Robert Griesemer – Going Go|date=7 May 2012|website=Channel 9|publisher=Microsoft}}</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 name="append">{{Cite web|url=http://blog.golang.org/slices|title=Arrays, slices (and strings): The mechanics of 'append'|last=Pike|first=Rob|date=26 September 2013|website=The Go Blog|access-date=7 March 2015|archive-date=2015-03-07|archive-url=https://web.archive.org/web/20150307201319/http://blog.golang.org/slices|dead-url=no}}</ref> tim Google yang dirancang bahasa dibangun setidaknya satu compiler untuk eksperimental dialek Go secara umum, tapi tidak merilisnya.<ref>{{Cite web|url=http://channel9.msdn.com/Blogs/Charles/Erik-Meijer-and-Robert-Griesemer-Go|title=E2E: Erik Meijer and Robert Griesemer – Going Go|date=7 May 2012|website=Channel 9|publisher=Microsoft|access-date=2018-03-14|archive-date=2015-04-02|archive-url=https://web.archive.org/web/20150402153550/http://channel9.msdn.com/Blogs/Charles/Erik-Meijer-and-Robert-Griesemer-Go|dead-url=no}}</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>{{Cite web|url=http://golang.org/doc/devel/weekly.html#2010-03-30|title=Weekly Snapshot History|website=golang.org}}</ref><ref>{{Cite web|url=https://groups.google.com/group/golang-nuts/browse_thread/thread/1ce5cd050bb973e4|title=Proposal for an exception-like mechanism|date=25 March 2010|website=golang-nuts|access-date=25 March 2010}}</ref><ref>{{Cite web|url=https://golang.org/doc/effective_go.html#panic|title=Effective Go|website=golang.org}}</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] {{Webarchive|url=https://web.archive.org/web/20131024144034/https://code.google.com/p/go-wiki/wiki/PanicAndRecover |date=2013-10-24 }}, Go wiki</ref><ref>{{Cite web|url=http://golang.org/doc/devel/weekly.html#2010-03-30|title=Weekly Snapshot History|website=golang.org|access-date=2018-03-14|archive-date=2017-04-03|archive-url=https://web.archive.org/web/20170403123818/https://golang.org/doc/devel/weekly.html#2010-03-30|dead-url=no}}</ref><ref>{{Cite web|url=https://groups.google.com/group/golang-nuts/browse_thread/thread/1ce5cd050bb973e4|title=Proposal for an exception-like mechanism|date=25 March 2010|website=golang-nuts|access-date=25 March 2010|archive-date=2013-03-06|archive-url=https://web.archive.org/web/20130306195756/http://groups.google.com/group/golang-nuts/browse_thread/thread/1ce5cd050bb973e4|dead-url=no}}</ref><ref>{{Cite web|url=https://golang.org/doc/effective_go.html#panic|title=Effective Go|website=golang.org|access-date=2018-03-14|archive-date=2015-01-06|archive-url=https://web.archive.org/web/20150106084926/https://golang.org/doc/effective_go.html#panic|dead-url=no}}</ref>


=== Kritik ===
=== Kritik ===
kritikus Go menyatakan bahwa:
kritikus Go menyatakan bahwa:
* kurangnya waktu kompilasi generik mengarah ke kode duplikasi, metaprogramming tidak dapat  diperiksa secara statis<ref name="yager">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 algoritma generik<ref>{{Cite web|url=https://talks.golang.org/2014/gocon-tokyo.slide#50|title=Go: 90% Perfect, 100% of the time|last=Fitzpatrick|first=Brad|access-date=28 January 2016}}</ref>
* kurangnya waktu kompilasi generik mengarah ke kode duplikasi, metaprogramming tidak dapat diperiksa secara statis<ref name="yager">Will Yager, [http://yager.io/programming/go.html Why Go is not Good] {{Webarchive|url=https://web.archive.org/web/20190716202032/http://yager.io/programming/go.html |date=2019-07-16 }}</ref><ref>Egon Elbre, [https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/edit# Summary of Go Generics discussions] {{Webarchive|url=https://web.archive.org/web/20230521062621/https://docs.google.com/document/d/1vrAy9gMpMoS3uaVphB32uVXX4pi-HnNjkMEgyAHX4N4/edit |date=2023-05-21 }}</ref> dan standar perpustakaan tidak menawarkan algoritme generik<ref>{{Cite web|url=https://talks.golang.org/2014/gocon-tokyo.slide#50|title=Go: 90% Perfect, 100% of the time|last=Fitzpatrick|first=Brad|access-date=28 January 2016|archive-date=2019-02-03|archive-url=https://web.archive.org/web/20190203070701/https://talks.golang.org/2014/gocon-tokyo.slide#50|dead-url=no}}</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>
* 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] {{Webarchive|url=https://web.archive.org/web/20161103030708/http://jozefg.bitbucket.org/posts/2013-08-23-leaving-go.html |date=2016-11-03 }}</ref>
* jenis sistem kurang pengetikan Hindley–Milner, menghambat keamanan dan/atau ekspresi<ref name="yager">Will Yager, [http://yager.io/programming/go.html Why Go is not Good]</ref><ref name="forsyth">Jared Forsyth, [https://jaredly.github.io/2014/03/22/rust-vs-go/ Rust vs. Go]</ref><ref name="dobronszki">Janos Dobronszki, [http://crufter.com/2014/12/01/everyday-hassles-in-go/ Everyday Hassles in Go]</ref>
* jenis sistem kurang pengetikan Hindley–Milner, menghambat keamanan dan/atau ekspresi<ref name="yager"/><ref name="forsyth">Jared Forsyth, [https://jaredly.github.io/2014/03/22/rust-vs-go/ Rust vs. Go] {{Webarchive|url=https://web.archive.org/web/20150519213448/http://jaredly.github.io/2014/03/22/rust-vs-go/ |date=2015-05-19 }}</ref><ref name="dobronszki">Janos Dobronszki, [http://crufter.com/2014/12/01/everyday-hassles-in-go/ Everyday Hassles in Go] {{Webarchive|url=https://web.archive.org/web/20141230150331/http://crufter.com/2014/12/01/everyday-hassles-in-go/ |date=2014-12-30 }}</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.
* 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 standarisasi cara-cara untuk menerapkan kode generasi.<ref>Rob Pike, [https://blog.golang.org/generate Generating code]</ref>
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] {{Webarchive|url=https://web.archive.org/web/20131121175535/http://commandcenter.blogspot.de/2012/06/less-is-exponentially-more.html |date=2013-11-21 }}</ref> dan menjelaskan beberapa keputusan tertentu pada suhu udara,<ref>The Go Authors, [http://golang.org/doc/faq Frequently Asked Questions (FAQ)] {{Webarchive|url=https://web.archive.org/web/20190107052512/https://golang.org/doc/faq |date=2019-01-07 }}</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] {{Webarchive|url=https://web.archive.org/web/20210810120352/https://blog.golang.org/generate |date=2021-08-10 }}</ref>


GC telah ditingkatkan untuk sub-milidetik waktu jeda dalam versi kemudian.<ref>{{Cite web|url=https://blog.twitch.tv/gos-march-to-low-latency-gc-a6fa96f06eb7#.68hdx6qc1|title=Go’s march to low-latency GC|last=Rhys Hiltner|date=2016-07-05|publisher=[[Twitch.tv]]|quote=It’s the story of how improvements to the Go runtime between Go 1.4 and Go 1.6 gave us a 20x improvement in garbage collection (GC) pause time, of how we’ve gotten another 10x improvement in Go 1.6’s pauses, and of how sharing our experience with the Go runtime team helped them give us an additional 10x speedup in Go 1.7 while obsoleting our manual tuning.}}</ref><ref>Richard Hudson, [http://golang.org/s/go14gc Go 1.4+ Garbage Collection (GC) Plan and Roadmap]</ref><ref>{{Cite web|url=https://twitter.com/brianhatfield/status/804355831080751104?lang=en|title=SUB. MILLISECOND. PAUSE. TIME. ON. AN. 18. GIG. HEAP.|last=Hatfield|first=Brian|date=2016-12-01|language=en|access-date=2017-10-07}}</ref> Namun, para pengembang mengakui bahwa GC ini algoritma ini tidak [[Komputasi waktu nyata|hard real-time]].{{Butuh rujukan|date=December 2016}}
GC telah ditingkatkan untuk sub-milidetik waktu jeda dalam versi kemudian.<ref>{{Cite web|url=https://blog.twitch.tv/gos-march-to-low-latency-gc-a6fa96f06eb7#.68hdx6qc1|title=Go’s march to low-latency GC|last=Rhys Hiltner|date=2016-07-05|publisher=[[Twitch.tv]]|quote=It’s the story of how improvements to the Go runtime between Go 1.4 and Go 1.6 gave us a 20x improvement in garbage collection (GC) pause time, of how we’ve gotten another 10x improvement in Go 1.6’s pauses, and of how sharing our experience with the Go runtime team helped them give us an additional 10x speedup in Go 1.7 while obsoleting our manual tuning.}}{{Pranala mati|date=Juni 2023 |bot=InternetArchiveBot |fix-attempted=yes }}</ref><ref>Richard Hudson, [http://golang.org/s/go14gc Go 1.4+ Garbage Collection (GC) Plan and Roadmap]</ref><ref>{{Cite web|url=https://twitter.com/brianhatfield/status/804355831080751104?lang=en|title=SUB. MILLISECOND. PAUSE. TIME. ON. AN. 18. GIG. HEAP.|last=Hatfield|first=Brian|date=2016-12-01|language=en|access-date=2017-10-07|archive-date=2022-05-13|archive-url=https://web.archive.org/web/20220513182242/https://twitter.com/brianhatfield/status/804355831080751104?lang=en|dead-url=no}}</ref> Namun, para pengembang mengakui bahwa GC ini algoritme ini tidak [[Komputasi waktu nyata|hard real-time]].{{Butuh rujukan|date=December 2016}}


== Konvensi dan kode style ==
== Konvensi dan kode style ==
Go penulis menempatkan upaya substansial ke dalam molding gaya dan desain dari program:
Go penulis menempatkan upaya substansial ke dalam molding gaya dan desain dari program:
* Lekukan, jarak, dan permukaan lainnya-tingkat rincian kode secara otomatis distandarisasi oleh <code>gofmt</code> alat. <code>golint</code> apakah gaya tambahan pemeriksaan secara otomatis.
* Lekukan, jarak, dan permukaan lainnya-tingkat rincian kode secara otomatis distandardisasi oleh <code>gofmt</code> alat.<code>golint</code> apakah gaya tambahan pemeriksaan secara otomatis.
* Alat dan perpustakaan didistribusikan dengan pendekatan Go suggest standard  untuk hal-hal seperti dokumentasi API (<code>godoc</code>),<ref>{{Cite web|url=http://golang.org/doc/effective_go.html#commentary|title=Effective Go|website=golang.org}}</ref> pengujian (<code>go test</code>), bangunan (<code>go build</code>), manajemen paket (<code>go get</code>), dan sebagainya.
* Alat dan perpustakaan didistribusikan dengan pendekatan Go suggest standard untuk hal-hal seperti dokumentasi API (<code>godoc</code>),<ref>{{Cite web|url=http://golang.org/doc/effective_go.html#commentary|title=Effective Go|website=golang.org|access-date=2018-03-14|archive-date=2021-02-09|archive-url=https://web.archive.org/web/20210209204944/http://golang.org/doc/effective_go.html#commentary|dead-url=no}}</ref> pengujian (<code>go test</code>), bangunan (<code>go build</code>), manajemen paket (<code>go get</code>), dan sebagainya.
* Go memberlakukan aturan yang rekomendasi dalam bahasa lain, misalnya melarang siklik dependensi, variabel yang tidak terpakai atau impor, dan konversi tipe implisit.
* Go memberlakukan aturan yang rekomendasi dalam bahasa lain, misalnya melarang siklik dependensi, variabel yang tidak terpakai atau impor, dan konversi tipe implisit.
* Satu ''kelalaian'' dari fitur-fitur tertentu (misalnya, fungsional pemrograman pintas seperti <code>peta</code> dan Jawa-gaya <code>mencoba</code>/<code>akhirnya</code> blok) cenderung mendorong tertentu eksplisit, beton, dan pemrograman imperatif gaya.
* Satu ''kelalaian'' dari fitur-fitur tertentu (misalnya, fungsional pemrograman pintas seperti <code>peta</code> dan Jawa-gaya <code>mencoba</code>/<code>akhirnya</code> blok) cenderung mendorong tertentu eksplisit, beton, dan pemrograman imperatif gaya.
* Pada hari pertama Kunjungan tim menerbitkan sebuah [https://golang.org/doc/effective_go.html koleksi Go idiom], dan kemudian juga [https://github.com/golang/go/wiki/CodeReviewComments dikumpulkan kode meninjau komentar], [https://talks.golang.org/ pembicaraan], [http://blog.golang.org/errors-are-values resmi posting blog] untuk mengajarkan gaya dan coding filsafat Go.
* Pada hari pertama Kunjungan tim menerbitkan sebuah [https://golang.org/doc/effective_go.html koleksi Go idiom] {{Webarchive|url=https://web.archive.org/web/20150106084926/https://golang.org/doc/effective_go.html |date=2015-01-06 }}, dan kemudian juga [https://github.com/golang/go/wiki/CodeReviewComments dikumpulkan kode meninjau komentar] {{Webarchive|url=https://web.archive.org/web/20230806192914/https://github.com/golang/go/wiki/CodeReviewComments |date=2023-08-06 }}, [https://talks.golang.org/ pembicaraan] {{Webarchive|url=https://web.archive.org/web/20151002193935/http://talks.golang.org/ |date=2015-10-02 }}, [http://blog.golang.org/errors-are-values resmi posting blog] {{Webarchive|url=https://web.archive.org/web/20151208054515/http://blog.golang.org/errors-are-values |date=2015-12-08 }} untuk mengajarkan gaya dan coding filsafat Go.


== Alat-alat bahasa program ==
== Alat-alat ==
Go mencakup jenis debugging, testing, dan code-vetting tools yang sama seperti banyak distribusi bahasa. Distribusi Go meliputi, di antara alat lainnya,
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 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 test</code>, untuk unit pengujian dan microbenchmarks
* <code>go fmt</code>, untuk format kode
* <code>go fmt</code>, untuk format kode
* <code>go get</code>, untuk mengambil dan menginstal paket jarak jauh
* <code>go get</code>, untuk mengambil dan menginstal paket jarak jauh
* <code>go vet</code>, analisa statis mencari potensi kesalahan dalam kode
* <code>go vet</code>, analisis statis mencari potensi kesalahan dalam kode
* <code>go run</code>, sebuah jalan pintas untuk membangun dan mengeksekusi kode
* <code>go run</code>, sebuah jalan pintas untuk membangun dan mengeksekusi kode
* <code>godoc</code>, untuk menampilkan dokumentasi atau melayani via HTTP
* <code>godoc</code>, untuk menampilkan dokumentasi atau melayani via HTTP
Baris 139: Baris 277:
Hal ini juga termasuk profiling dan dukungan debugging, runtime instrumentasi (untuk, misalnya, melacak pengumpulan sampah jeda), dan kondisi balapan tester.
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 editor teks. Selain itu, beberapa [[Lingkungan pengembangan terpadu|Ide]] yang tersedia. Misalnya, LiteIDE, yang dicap sebagai "simpel, open source, cross-platform IDE 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>
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 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>{{Cite web |url=https://github.com/visualfc/liteide |title=LiteIDE |access-date=2018-03-14 |archive-date=2023-03-05 |archive-url=https://web.archive.org/web/20230305230428/https://github.com/visualfc/liteide |dead-url=no }}</ref> dan GoLand, yang mengklaim untuk menjadi "mampu dan ergonomis."<ref>{{Cite web |url=https://www.jetbrains.com/go/ |title=GoLand |access-date=2018-03-14 |archive-date=2017-11-20 |archive-url=https://web.archive.org/web/20171120065416/https://www.jetbrains.com/go/ |dead-url=no }}</ref>


== Catatan ==
== Catatan ==
Baris 146: Baris 284:
== Referensi ==
== Referensi ==
{{Reflist|30em}}
{{Reflist|30em}}
{{Commonscat|Go (programming language)}}

== 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}}

[[Kategori:Halaman dengan rujukan yang memiliki parameter duplikat]]
[[Kategori:Perangkat lunak tahun 2009]]
[[Kategori:Perangkat lunak tahun 2009]]
[[Kategori:Perangkat lunak lintas platform]]
[[Kategori:Perangkat lunak lintas platform]]

Revisi terkini sejak 22 November 2023 11.27

Go
ParadigmaMulti-paradigma: bersamaan imperatif, berorientasi objek[1][2]
Dirancang olehRobert Griesemer
Rob Pike
Ken Thompson
PengembangPara Penulis Go[3]
Rilis perdana10 November 2009; 14 tahun lalu (2009-11-10)
Rilis stabil
1.12.7[4] Sunting di Wikidata / 8 Juli 2019; 3 September 2019; 26 Februari 2020; 16 Juli 2020; 11 Agustus 2020; 12 November 2020; 3 Desember 2020; 19 Januari 2021; 4 Februari 2021; 16 Februari 2021; 10 Maret 2021; 11 Maret 2021; 1 April 2021; 6 Mei 2021; 3 Juni 2021; 12 Juli 2021; 5 Agustus 2021; 16 Agustus 2021; 9 September 2021; 7 Oktober 2021; 4 November 2021; 2 Desember 2021; 9 Desember 2021; 6 Januari 2022; 10 Februari 2022; 3 Maret 2022; 15 Maret 2022; 12 April 2022; 10 Mei 2022; 1 Juni 2022; 12 Juli 2022; 2 Agustus 2022; 6 September 2022; 4 Oktober 2022; 1 November 2022; 6 Desember 2022; 10 Januari 2023; 1 Februari 2023; 14 Februari 2023; 7 Maret 2023; 4 April 2023; 2 Mei 2023; 6 Juni 2023; 11 Juli 2023; 1 Agustus 2023; 8 Agustus 2023; 6 September 2023; 5 Oktober 2023; 10 Oktober 2023; 7 November 2023; 5 Desember 2023; 9 Januari 2024; 6 Februari 2024; 5 Maret 2024; 3 April 2024 (8 Juli 2019; 3 September 2019; 26 Februari 2020; 16 Juli 2020; 11 Agustus 2020; 12 November 2020; 3 Desember 2020; 19 Januari 2021; 4 Februari 2021; 16 Februari 2021; 10 Maret 2021; 11 Maret 2021; 1 April 2021; 6 Mei 2021; 3 Juni 2021; 12 Juli 2021; 5 Agustus 2021; 16 Agustus 2021; 9 September 2021; 7 Oktober 2021; 4 November 2021; 2 Desember 2021; 9 Desember 2021; 6 Januari 2022; 10 Februari 2022; 3 Maret 2022; 15 Maret 2022; 12 April 2022; 10 Mei 2022; 1 Juni 2022; 12 Juli 2022; 2 Agustus 2022; 6 September 2022; 4 Oktober 2022; 1 November 2022; 6 Desember 2022; 10 Januari 2023; 1 Februari 2023; 14 Februari 2023; 7 Maret 2023; 4 April 2023; 2 Mei 2023; 6 Juni 2023; 11 Juli 2023; 1 Agustus 2023; 8 Agustus 2023; 6 September 2023; 5 Oktober 2023; 10 Oktober 2023; 7 November 2023; 5 Desember 2023; 9 Januari 2024; 6 Februari 2024; 5 Maret 2024; 3 April 2024)
Tipe sistemKuat, statis, disimpulkan, struktural[5][6], nominal
Implementasi dariGo, Bahasa rakitan (gc); C++ (frontendgo)
Sistem operasiLinux, macOS, FreeBSD, NetBSD, OpenBSD,[7] Windows, Plan 9,[8] DragonFly BSD, Solaris
Lisensi3-clause BSD[3] + hibah paten[9]
Ekstensi nama berkas.go
Situs webgo.dev Sunting ini di Wikidata
Repositorigo.dev
Implementasi utama
gc, gccgo
Terpengaruh oleh
Alef, APL,[10] BCPL,[10] C, CSP, Limbo, Modula, Newsqueak, Oberon, occam, Pascal,[11] Smalltalk[12]
Mempengaruhi
Crystal
Sunting kotak info
Sunting kotak info • L • B
Info templat
Bantuan penggunaan templat ini


Go (sering disebut sebagai Golang) adalah bahasa pemrograman yang dibuat di Google[13] pada tahun 2009 oleh Robert Griesemer, Rob Pike, dan Ken Thompson.[11] Go adalah bahasa pemrograman sumber terbuka yang mudah, sederhana, efisien. Selain itu, Go memiliki level yang sama dengan Java. Yaitu bahasa pemrograman yang dihimpun dan diketik dalam bahasa C, dengan fitur pengumpulan sampah, penulisan terstruktur, keamanan memori, dan pemrograman yang konkuren serta berurutan.[14] Kompiler dan IDE lainnya disediakan oleh Google dari awal secara bebas dan sumber terbuka.[15]

Golang dirilis perdana pada bulan November 2009. Golang telah digunakan di lingkungan produksi oleh Google dan perusahaan lain.[16]

Dua implementasi utama yang ada:

"Gc" toolchain telah self-hosting sejak versi 1.5.[20]

Go awalnya sebuah percobaan oleh para insinyur Google Robert Griesemer, Rob Pike, dan Ken Thompson untuk merancang sebuah bahasa pemrograman baru yang akan menyelesaikan kritik umum dari bahasa lain selama masih mempertahankan karakteristik positif. Pengembang dipertimbangkan bahasa baru seperti:[21]

Dalam wawancara terakhir, semua dari tiga perancang bahasa tidak suka terhadap kompleksitas C++ sehingga menjadi motivasi utama untuk mendesain sebuah bahasa baru.[23][24][25]

Google merilis Go 1.0 pada bulan Maret 2012.[26][27]

Go 1 menjamin kompatibilitas[28] untuk spesifikasi bahasa dan bagian utama dari pustaka standar. Semua versi hingga perilisan Go 1.19 saat[29] telah menepati janji ini.

Setiap perilisan utama Go didukung hingga ada dua perilisan utama yang lebih baru.[30]

Perilisan Status Tanggal perilisan Akhir pemeliharaan
Old version, no longer supported: go1 Old version, no longer supported: Kadaluwarsa 2012-03-28 2013-12-01
Old version, no longer supported: go1.1 Old version, no longer supported: Kadaluwarsa 2013-05-13 2014-06-18
Old version, no longer supported: go1.2 Old version, no longer supported: Kadaluwarsa 2013-12-01 2014-12-10
Old version, no longer supported: go1.3 Old version, no longer supported: Kadaluwarsa 2014-06-18 2015-08-19
Old version, no longer supported: go1.4 Old version, no longer supported: Kadaluwarsa 2014-12-10 2016-02-17
Old version, no longer supported: go1.5 Old version, no longer supported: Kadaluwarsa 2015-08-19 2016-08-15
Old version, no longer supported: go1.6 Old version, no longer supported: Kadaluwarsa 2016-02-17 2017-02-16
Old version, no longer supported: go1.7 Old version, no longer supported: Kadaluwarsa 2016-08-15 2017-08-24
Old version, no longer supported: go1.8 Old version, no longer supported: Kadaluwarsa 2017-02-16 2018-02-16
Old version, no longer supported: go1.9 Old version, no longer supported: Kadaluwarsa 2017-08-24 2018-08-24
Old version, no longer supported: go1.10 Old version, no longer supported: Kadaluwarsa 2018-02-16 2019-02-25
Old version, no longer supported: go1.11 Old version, no longer supported: Kadaluwarsa 2018-08-24 2019-09-03
Old version, no longer supported: go1.12 Old version, no longer supported: Kadaluwarsa 2019-02-25 2020-02-25
Old version, no longer supported: go1.13 Old version, no longer supported: Kadaluwarsa 2019-09-03 2020-08-11
Old version, no longer supported: go1.14 Old version, no longer supported: Kadaluwarsa 2020-02-25 2021-02-16
Old version, no longer supported: go1.15 Old version, no longer supported: Kadaluwarsa 2020-08-11 2021-08-16
Old version, no longer supported: go1.16 Old version, no longer supported: Kadaluwarsa 2021-02-16 2022-03-15
Old version, no longer supported: go1.17 Old version, no longer supported: Kadaluwarsa 2021-08-16 2022-08-02
Older version, yet still supported: go1.18 Older version, yet still supported: Pemeliharaan 2022-03-15 Q1 2023
Current stable version: go1.19 Current stable version: Saat ini 2022-08-02 Q3 2023
Future release: go1.20 Future release: Direncanakan Q1 2023 Q1 2024
Legenda:
Versi lama
Versi lebih lama, tetapi masih didukung
Versi terkini
Versi pratayang terakhir
Rilis selanjutnya

Desain Bahasa

[sunting | sunting sumber]

Go lebih dikenali dalam tradisi C, tapi membuat banyak perubahan untuk meningkatkan singkatnya, kesederhanaan, dan keamanan. Go terdiri dari:

  • Sintaks dan lingkungan mengadopsi pola-pola yang lebih umum dalam bahasa dinamis:[31]
    • Opsional ringkas variabel deklarasi dan inisialisasi melalui jenis inferensi (x := 0 tidak int x = 0; atau var x = 0;).
    • Kompilasi cepat.[32]
    • Remote manajemen paket (go get)[33] dan paket dokumentasi daring.[34]
  • Khas pendekatan untuk masalah tertentu:
    • Built-in concurrency primitif: proses ringan (goroutines), saluran, dan yang memilih pernyataan.
    • Sebuah antarmuka sistem di tempat virtual warisan, dan jenis embedding bukan non-virtual warisan.
    • Sebuah toolchain yang, secara default, menghasilkan statis terkait binari asli tanpa dependensi eksternal.
  • Keinginan untuk menjaga bahasa spesifikasi yang cukup sederhana untuk memegang di sebuah programmer kepala,[35] di bagian dengan menghilangkan fitur-fitur umum untuk bahasa yang sama.

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.[a] 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.[butuh rujukan]

Jenis (Tipe Data)

[sunting | sunting sumber]

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.[36] jenis Catatan dapat didefinisikan dengan kata kunci struct.[butuh rujukan]

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.[37][38][39]

Petunjuk tersedia untuk semua type, dan pointer-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.[40] tidak Ada pointer aritmetika, kecuali melalui khusus jenis unsafe.Pointer di perpustakaan standar.[butuh rujukan]

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.[butuh rujukan]

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.[41] sebagai contoh, type kata kunci yang dapat digunakan untuk mendefinisikan tipe untuk IPv4 alamat, yang adalah 32-bit unsigned integer.[butuh rujukan]

Dengan jenis definisi tersebut, ipv4addr(x) menafsirkan uint32 nilai x sebagai alamat IP. Dengan menginisiasi x untuk variabel jenis ipv4addr adalah kesalahan tipe.[butuh rujukan]

Ekspresi konstan dapat berupa diketik atau "untyped"; mereka diberi jenis ketika ditugaskan untuk mengetik variabel jika nilai mereka mewakili melewati waktu kompilasi cek.[42]

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.[butuh rujukan]

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.[43]

Sistem antarmuka

[sunting | sunting sumber]

Go menyediakan dua fitur yang menggantikan kelas warisan.[butuh rujukan]

Yang pertama adalah embedding, yang dapat dilihat sebagai bentuk otomatis dari komposisi[44] atau delegasi.[45]:255

Yang kedua adalah antarmuka, yang menyediakan runtime polimorfisme.[46]:266 menyediakan Antarmuka yang terbatas bentuk struktural mengetik di sebaliknya nominal jenis sistem Go. Setiap jenis yang mengimplementasikan semua metode dari interface sesuai dengan antarmuka yang. Antarmuka Go yang dirancang setelah protokol dari bahasa pemrograman Smalltalk.[47] Beberapa sumber yang menggunakan istilah bebek mengetik ketika menggambarkan Go antarmuka.[48][49] Meskipun istilah bebek mengetik tidak tepat didefinisikan dan oleh karena itu tidak salah, itu biasanya berarti bahwa kesesuaian jenis ini tidak statis diperiksa. Sejak kesesuaian untuk Go dengan antarmuka yang diperiksa..... dengan Go compiler (kecuali ketika melakukan pernyataan jenis), penulis Go lebih suka menggunakan istilah pengetikan struktural.[butuh rujukan]

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.[46]: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.[46]: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.[46]: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,[50] yang memeriksa terhadap satu potensi jenis, dan jenis switch,[51] yang memeriksa terhadap beberapa jenis.[butuh rujukan]

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.[46]: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.[52] 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.[butuh rujukan]

Antarmuka nilai-nilai yang diimplementasikan dengan menggunakan pointer ke data dan pointer ke run-time jenis informasi.[53] Seperti beberapa jenis lain diimplementasikan dengan menggunakan pointer pada Go, antarmuka nilai-nilai nihil jika tidak terinisialisasi.[54]

Sistem paket

[sunting | sunting sumber]

Dalam Kunjungan itu sistem paket, setiap paket memiliki jalan (misalnya, "kompres/bzip2" atau "golang.org/x/net/html") dan nama (misalnya, bzip2 atau html). Referensi lain paket' definisi harus selalu menjadi diawali dengan paket lain nama, dan hanya bermodal nama dari paket-paket yang lain dapat diakses: io.Pembaca umum tapi bzip2.pembaca tidak.[55] Perintah go get dapat mengambil paket yang disimpan dalam repositori jauh seperti GitHub,[56] 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.[57]

Proposal yang ada untuk memperkenalkan tepat paket solusi manajemen untuk Go mirip dengan Karat's sistem cargo atau Node's npm sistem.[58]

Concurrency: goroutines dan saluran

[sunting | sunting sumber]

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.[59]

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.[60]:10

Sementara standar perpustakaan menampilkan paket yang paling klasik concurrency control struktur (mutex kunci, dll.) tersedia,[60]:151–152 idiomatik bersamaan program bukan sukai saluran, yang memberikan mengirim pesan antara goroutines.[61] Opsional buffer menyimpan pesan di FIFO order[45]:43 dan memungkinkan mengirim goroutines untuk melanjutkan sebelum mereka menerima pesan.[butuh rujukan]

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.[62]

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.[60]: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.[63] Saluran juga telah ditemukan menggunakan lebih dari biasanya gagasan interprocess communication, seperti melayani sebagai concurrency-daftar aman dari daur ulang buffer,[64] pelaksana coroutines (yang membantu menginspirasi nama goroutine),[65] dan menerapkan iterator.[66]

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 ),[67] Go tidak menyediakan built-in gagasan aman atau diverifikasi concurrency.[68] 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 Go (bahasa pemrograman) § Lack of race condition safety, di bawah ini.[butuh rujukan]

Kesesuaian untuk pemrograman paralel

[sunting | sunting sumber]

Meskipun Go concurrency fitur yang tidak ditujukan terutama untuk pemrosesan paralel,[59] mereka dapat digunakan untuk program memori bersama multi-prosesor mesin. Berbagai studi telah dilakukan untuk keefektifan pendekatan ini.[69] 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.[69]

Kurangnya kondisi balapan keselamatan

[sunting | sunting sumber]

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.[70][71]

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.[60]:155

Kelalaian

[sunting | sunting sumber]

Go sengaja menghilangkan fitur-fitur tertentu yang umum dalam bahasa lain, termasuk (implementasi) warisan, pemrograman generik, pernyataan, pointer aritmetika, dan konversi tipe implisit.[butuh rujukan]

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.Kesalahan pengutipan: Tag <ref> harus ditutup oleh </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.[37] tim Google yang dirancang bahasa dibangun setidaknya satu compiler untuk eksperimental dialek Go secara umum, tapi tidak merilisnya.[72]

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).[73][74][75][76]

kritikus Go menyatakan bahwa:

  • kurangnya waktu kompilasi generik mengarah ke kode duplikasi, metaprogramming tidak dapat diperiksa secara statis[77][78] dan standar perpustakaan tidak menawarkan algoritme generik[79]
  • kurangnya ekstensi bahasa (melalui, misalnya, operator overloading) membuat tugas-tugas tertentu lebih verbose[80]
  • jenis sistem kurang pengetikan Hindley–Milner, menghambat keamanan dan/atau ekspresi[77][81][82]
  • 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,[83] dan menjelaskan beberapa keputusan tertentu pada suhu udara,[84] 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.[85]

GC telah ditingkatkan untuk sub-milidetik waktu jeda dalam versi kemudian.[86][87][88] Namun, para pengembang mengakui bahwa GC ini algoritme ini tidak hard real-time.[butuh rujukan]

Konvensi dan kode style

[sunting | sunting sumber]

Go penulis menempatkan upaya substansial ke dalam molding gaya dan desain dari program:

  • Lekukan, jarak, dan permukaan lainnya-tingkat rincian kode secara otomatis distandardisasi oleh gofmt alat.golint apakah gaya tambahan pemeriksaan secara otomatis.
  • Alat dan perpustakaan didistribusikan dengan pendekatan Go suggest standard untuk hal-hal seperti dokumentasi API (godoc),[89] pengujian (go test), bangunan (go build), manajemen paket (go get), dan sebagainya.
  • Go memberlakukan aturan yang rekomendasi dalam bahasa lain, misalnya melarang siklik dependensi, variabel yang tidak terpakai atau impor, dan konversi tipe implisit.
  • Satu kelalaian dari fitur-fitur tertentu (misalnya, fungsional pemrograman pintas seperti peta dan Jawa-gaya mencoba/akhirnya blok) cenderung mendorong tertentu eksplisit, beton, dan pemrograman imperatif gaya.
  • Pada hari pertama Kunjungan tim menerbitkan sebuah koleksi Go idiom Diarsipkan 2015-01-06 di Wayback Machine., dan kemudian juga dikumpulkan kode meninjau komentar Diarsipkan 2023-08-06 di Wayback Machine., pembicaraan Diarsipkan 2015-10-02 di Wayback Machine., resmi posting blog Diarsipkan 2015-12-08 di Wayback Machine. untuk mengajarkan gaya dan coding filsafat Go.

Alat-alat

[sunting | sunting sumber]

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 makefiles
  • go test, untuk unit pengujian dan microbenchmarks
  • go fmt, untuk format kode
  • go get, untuk mengambil dan menginstal paket jarak jauh
  • go vet, analisis statis mencari potensi kesalahan dalam kode
  • go run, sebuah jalan pintas untuk membangun dan mengeksekusi kode
  • godoc, untuk menampilkan dokumentasi atau melayani via HTTP
  • gorename, untuk mengganti nama variabel, fungsi, dan jenis-cara aman
  • go 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",[90] dan GoLand, yang mengklaim untuk menjadi "mampu dan ergonomis."[91]

  1. ^ Usually, exactly one of the result and error values has a value other than the type's zero value; sometimes both do, as when a read or write can only be partially completed, and sometimes neither, as when a read returns 0 bytes. See Semipredicate problem: Multivalued return.

Referensi

[sunting | sunting sumber]
  1. ^ "Is Go an object-oriented language?". Diarsipkan dari versi asli tanggal 2017-05-03. Diakses tanggal April 13, 2019. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy. 
  2. ^ "Go: code that grows with grace". Diarsipkan dari versi asli tanggal 2022-06-18. Diakses tanggal June 24, 2018. Go is Object Oriented, but not in the usual way. 
  3. ^ a b "Text file LICENSE". The Go Programming Language. Diarsipkan dari versi asli tanggal 2021-11-01. Diakses tanggal October 5, 2012. 
  4. ^ "Release History - The Go Programming Language" (dalam bahasa bahasa Inggris). Diakses tanggal 22 Juli 2019. 
  5. ^ "Why doesn't Go have "implements" declarations?". golang.org. Diarsipkan dari versi asli tanggal 2017-05-03. Diakses tanggal 1 October 2015. 
  6. ^ Pike, Rob (2014-12-22). "Rob Pike on Twitter". Diarsipkan dari versi asli tanggal 2022-04-07. Diakses tanggal 2016-03-13. Go has structural typing, not duck typing. Full interface satisfaction is checked and required. 
  7. ^ "lang/go: go-1.4 – Go programming language". OpenBSD ports. 2014-12-23. Diarsipkan dari versi asli tanggal 2021-09-16. Diakses tanggal 2015-01-19. 
  8. ^ "Go Porting Efforts". Go Language Resources. cat-v. 12 January 2010. Diarsipkan dari versi asli tanggal 2021-08-12. Diakses tanggal 18 January 2010. 
  9. ^ "Additional IP Rights Grant". The Go Programming Language. Diarsipkan dari versi asli tanggal 2021-10-26. Diakses tanggal October 5, 2012. 
  10. ^ a b Pike, Rob (2014-04-24). "Hello Gophers". Diarsipkan dari versi asli tanggal 2018-12-01. Diakses tanggal 2016-03-11. 
  11. ^ a b "Language Design FAQ". golang.org. 16 January 2010. Diarsipkan dari versi asli tanggal 2013-01-02. Diakses tanggal 27 February 2010. 
  12. ^ "The Evolution of Go". Diarsipkan dari versi asli tanggal 2017-01-16. Diakses tanggal 2015-09-26. 
  13. ^ Kincaid, Jason (10 November 2009). "Google's Go: A New Programming Language That's Python Meets C++". TechCrunch. Diarsipkan dari versi asli tanggal 2010-01-18. Diakses tanggal 18 January 2010.  More than one of |work= dan |newspaper= specified (bantuan)
  14. ^ Metz, Cade (5 May 2011). "Google Go boldly goes where no code has gone before". The Register. Diarsipkan dari versi asli tanggal 2019-09-28. Diakses tanggal 2018-03-14. 
  15. ^ "Salinan arsip". Diarsipkan dari versi asli tanggal 2021-11-01. Diakses tanggal 2018-03-14. 
  16. ^ "Go FAQ: Is Google using Go internally?". Diarsipkan dari versi asli tanggal 2019-01-07. Diakses tanggal 2013-03-09. 
  17. ^ "Google's In-House Programming Language Now Runs on Phones". wired.com. 19 August 2015. Diarsipkan dari versi asli tanggal 2021-09-18. Diakses tanggal 2018-03-14. 
  18. ^ "FAQ: Implementation". golang.org. 16 January 2010. Diarsipkan dari versi asli tanggal 2013-01-02. Diakses tanggal 2010-01-18. 
  19. ^ "Installing GCC: Configuration". Diarsipkan dari versi asli tanggal 2023-07-20. Diakses tanggal 2011-12-03. Ada, Go and Objective-C++ are not default languages 
  20. ^ "Go 1.5 Release Notes". Diarsipkan dari versi asli tanggal 2016-04-03. Diakses tanggal 28 January 2016. The compiler and runtime are now implemented in Go and assembler, without C. 
  21. ^ Pike, Rob (28 April 2010). "Another Go at Language Design". Stanford EE Computer Systems Colloquium. Stanford University. Diarsipkan dari versi asli tanggal 2014-06-12. Diakses tanggal 2018-03-14.  Video available Diarsipkan 2016-11-25 di Wayback Machine..
  22. ^ "Frequently Asked Questions (FAQ) - The Go Programming Language". golang.org. Diarsipkan dari versi asli tanggal 2017-05-03. Diakses tanggal 2016-02-26. 
  23. ^ Andrew Binstock (18 May 2011). "Dr. Dobb's: Interview with Ken Thompson". Diarsipkan dari versi asli tanggal 2014-03-13. Diakses tanggal 2014-02-07. 
  24. ^ Pike, Rob (2012). "Less is exponentially more". Diarsipkan dari versi asli tanggal 2016-03-21. Diakses tanggal 2018-03-14. 
  25. ^ Robert Griesemer (2015). "The Evolution of Go". Diarsipkan dari versi asli tanggal 2017-01-16. Diakses tanggal 2018-03-14. 
  26. ^ Shankland, Stephen (2012-03-30). "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". News. CBS Interactive Inc. Diarsipkan dari versi asli tanggal 2020-11-25. Diakses tanggal 2017-08-06. Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++. 
  27. ^ "Release History". Diarsipkan dari versi asli tanggal 2017-02-17. Diakses tanggal 2018-03-14. 
  28. ^ "Go 1 and the Future of Go Programs". golang.org. Diarsipkan dari versi asli tanggal 2017-10-02. Diakses tanggal 2022-10-10. 
  29. ^ "Go 1.19 Release Notes". go.dev. Diarsipkan dari versi asli tanggal 2023-05-29. Diakses tanggal 2022-10-10. 
  30. ^ "Release History". golang.org. Diarsipkan dari versi asli tanggal 2017-02-17. Diakses tanggal 2022-10-10. 
  31. ^ Pike, Rob. "The Go Programming Language". YouTube. Diarsipkan dari versi asli tanggal 2013-02-11. Diakses tanggal 2011-07-01. 
  32. ^ Rujukan kosong (bantuan) 
  33. ^ Download and install packages and dependencies - go - The Go Programming Language Diarsipkan 2017-03-12 di Wayback Machine.; see godoc.org Diarsipkan 2020-10-07 di Wayback Machine. for addresses and documentation of some packages
  34. ^ "GoDoc". godoc.org. Diarsipkan dari versi asli tanggal 2020-10-07. Diakses tanggal 2018-03-14. 
  35. ^ Rob Pike, on The Changelog Diarsipkan 2013-10-20 di Wayback Machine. podcast
  36. ^ Rob Pike, Strings, bytes, runes and characters in Go Diarsipkan 2015-01-03 di Wayback Machine., 23 October 2013
  37. ^ a b Pike, Rob (26 September 2013). "Arrays, slices (and strings): The mechanics of 'append'". The Go Blog. Diarsipkan dari versi asli tanggal 2015-03-07. Diakses tanggal 7 March 2015. 
  38. ^ Andrew Gerrand, Go Slices: usage and internals Diarsipkan 2015-01-07 di Wayback Machine.
  39. ^ The Go Authors, Effective Go: Slices Diarsipkan 2021-02-09 di Wayback Machine.
  40. ^ The Go authors Selectors - The Go Programming Language Specification Diarsipkan 2021-05-13 di Wayback Machine. and Calls - The Go Programming Language Specification Diarsipkan 2021-05-13 di Wayback Machine.
  41. ^ "The Go Programming Language Specification". golang.org. Diarsipkan dari versi asli tanggal 2021-03-18. Diakses tanggal 2018-03-14. 
  42. ^ "The Go Programming Language Specification". golang.org. Diarsipkan dari versi asli tanggal 2021-03-18. Diakses tanggal 2018-03-14. 
  43. ^ "The Go Programming Language Specification". golang.org. Diarsipkan dari versi asli tanggal 2021-03-18. Diakses tanggal 2018-03-14. 
  44. ^ Kesalahan pengutipan: Tag <ref> tidak sah; tidak ditemukan teks untuk ref bernama gohotdraw
  45. ^ a b Summerfield, Mark (2012). Programming in Go: Creating Applications for the 21st Century. Addison-Wesley. 
  46. ^ a b c d e Balbaert, Ivo (2012). The Way to Go: A Thorough Introduction to the Go Programming Language. iUniverse. 
  47. ^ "The Evolution of Go". talks.golang.org. Diarsipkan dari versi asli tanggal 2017-01-16. Diakses tanggal 2016-03-13. 
  48. ^ Diggins, Christopher (2009-11-24). "Duck Typing and the Go Programming Language". Dr. Dobb's. Diarsipkan dari versi asli tanggal 2020-08-07. Diakses tanggal 2016-03-10. 
  49. ^ Ryer, Mat (2015-12-01). "Duck typing in Go". Diarsipkan dari versi asli tanggal 2023-06-09. Diakses tanggal 2016-03-10. 
  50. ^ "The Go Programming Language Specification". golang.org. Diarsipkan dari versi asli tanggal 2021-03-18. Diakses tanggal 2018-03-14. 
  51. ^ "The Go Programming Language Specification". golang.org. Diarsipkan dari versi asli tanggal 2021-03-18. Diakses tanggal 2018-03-14. 
  52. ^ reflect.ValueOf(i interface{}) Diarsipkan 2021-07-03 di Wayback Machine. converts an interface{} to a reflect.Value that can be further inspected
  53. ^ "Go Data Structures: Interfaces". Diarsipkan dari versi asli tanggal 2023-07-08. Diakses tanggal 15 November 2012. 
  54. ^ "The Go Programming Language Specification". golang.org. Diarsipkan dari versi asli tanggal 2021-03-18. Diakses tanggal 2018-03-14. 
  55. ^ "A Tutorial for the Go Programming Language". The Go Programming Language. Google. Diarsipkan dari versi asli tanggal 2013-07-09. Diakses tanggal 10 March 2013. In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared. 
  56. ^ "go - The Go Programming Language". golang.org. Diarsipkan dari versi asli tanggal 2017-03-12. Diakses tanggal 2018-03-14. 
  57. ^ "How to Write Go Code". golang.org. Diarsipkan dari versi asli tanggal 2019-02-13. Diakses tanggal 2018-03-14. The packages from the standard library are given short import paths such as "fmt" and "net/http". For your own packages, you must choose a base path that is unlikely to collide with future additions to the standard library or other external libraries. If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path. For instance, if you have a GitHub account at github.com/user, that should be your base path 
  58. ^ "Go Packaging Proposal Process". Diarsipkan dari versi asli tanggal 2022-04-09. Diakses tanggal 2018-03-14. 
  59. ^ a b Rob Pike, Concurrency is not Parallelism Diarsipkan 2023-07-09 di Wayback Machine.
  60. ^ a b c d Kesalahan pengutipan: Tag <ref> tidak sah; tidak ditemukan teks untuk ref bernama phrasebook
  61. ^ "Effective Go". golang.org. Diarsipkan dari versi asli tanggal 2021-02-09. Diakses tanggal 2018-03-14. 
  62. ^ "The Go Memory Model". Diarsipkan dari versi asli tanggal 2021-11-16. Diakses tanggal 10 April 2017. 
  63. ^ "Go Concurrency Patterns". golang.org. Diarsipkan dari versi asli tanggal 2021-02-05. Diakses tanggal 2018-03-14. 
  64. ^ John Graham-Cumming, Recycling Memory Buffers in Go Diarsipkan 2013-10-14 di Wayback Machine.
  65. ^ "tree.go". Diarsipkan dari versi asli tanggal 2021-10-26. Diakses tanggal 2018-03-14. 
  66. ^ Ewen Cheslack-Postava, Iterators in Go Diarsipkan 2023-07-08 di Wayback Machine.
  67. ^ Brian W. Kernighan, A Descent Into Limbo Diarsipkan 2023-07-20 di Wayback Machine.
  68. ^ "The Go Memory Model". Google. Diarsipkan dari versi asli tanggal 2010-11-23. Diakses tanggal 5 January 2011. 
  69. ^ a b Rujukan kosong (bantuan) 
  70. ^ Russ Cox, Off to the Races Diarsipkan 2023-07-08 di Wayback Machine.
  71. ^ Pike, Rob (October 25, 2012). "Go at Google: Language Design in the Service of Software Engineering". Google, Inc. Diarsipkan dari versi asli tanggal 2022-07-06. Diakses tanggal 2018-03-14.  "There is one important caveat: Go is not purely memory safe in the presence of concurrency."
  72. ^ "E2E: Erik Meijer and Robert Griesemer – Going Go". Channel 9. Microsoft. 7 May 2012. Diarsipkan dari versi asli tanggal 2015-04-02. Diakses tanggal 2018-03-14. 
  73. ^ Panic And Recover Diarsipkan 2013-10-24 di Wayback Machine., Go wiki
  74. ^ "Weekly Snapshot History". golang.org. Diarsipkan dari versi asli tanggal 2017-04-03. Diakses tanggal 2018-03-14. 
  75. ^ "Proposal for an exception-like mechanism". golang-nuts. 25 March 2010. Diarsipkan dari versi asli tanggal 2013-03-06. Diakses tanggal 25 March 2010. 
  76. ^ "Effective Go". golang.org. Diarsipkan dari versi asli tanggal 2015-01-06. Diakses tanggal 2018-03-14. 
  77. ^ a b Will Yager, Why Go is not Good Diarsipkan 2019-07-16 di Wayback Machine.
  78. ^ Egon Elbre, Summary of Go Generics discussions Diarsipkan 2023-05-21 di Wayback Machine.
  79. ^ Fitzpatrick, Brad. "Go: 90% Perfect, 100% of the time". Diarsipkan dari versi asli tanggal 2019-02-03. Diakses tanggal 28 January 2016. 
  80. ^ Danny Gratzer, Leaving Go Diarsipkan 2016-11-03 di Wayback Machine.
  81. ^ Jared Forsyth, Rust vs. Go Diarsipkan 2015-05-19 di Wayback Machine.
  82. ^ Janos Dobronszki, Everyday Hassles in Go Diarsipkan 2014-12-30 di Wayback Machine.
  83. ^ Rob Pike, Less is exponentially more Diarsipkan 2013-11-21 di Wayback Machine.
  84. ^ The Go Authors, Frequently Asked Questions (FAQ) Diarsipkan 2019-01-07 di Wayback Machine.
  85. ^ Rob Pike, Generating code Diarsipkan 2021-08-10 di Wayback Machine.
  86. ^ Rhys Hiltner (2016-07-05). "Go's march to low-latency GC". Twitch.tv. It’s the story of how improvements to the Go runtime between Go 1.4 and Go 1.6 gave us a 20x improvement in garbage collection (GC) pause time, of how we’ve gotten another 10x improvement in Go 1.6’s pauses, and of how sharing our experience with the Go runtime team helped them give us an additional 10x speedup in Go 1.7 while obsoleting our manual tuning. [pranala nonaktif permanen]
  87. ^ Richard Hudson, Go 1.4+ Garbage Collection (GC) Plan and Roadmap
  88. ^ Hatfield, Brian (2016-12-01). "SUB. MILLISECOND. PAUSE. TIME. ON. AN. 18. GIG. HEAP" (dalam bahasa Inggris). Diarsipkan dari versi asli tanggal 2022-05-13. Diakses tanggal 2017-10-07. 
  89. ^ "Effective Go". golang.org. Diarsipkan dari versi asli tanggal 2021-02-09. Diakses tanggal 2018-03-14. 
  90. ^ "LiteIDE". Diarsipkan dari versi asli tanggal 2023-03-05. Diakses tanggal 2018-03-14. 
  91. ^ "GoLand". Diarsipkan dari versi asli tanggal 2017-11-20. Diakses tanggal 2018-03-14. 

Pranala luar

[sunting | sunting sumber]