Go (Programmiersprache)
Paradigma | Multi-Paradigma: gleichzeitig Imperativ, objektorientierter[1][2] |
---|---|
Entworfen von | Robert Griesemer Rob Pike Ken Thompson |
Entwickler | Die Go -Autoren[3] |
Erstmals erschienen | 10. November 2009 |
Stabile Version | 1.19[4] / 2. August 2022 |
Disziplin tippen | Gefolgert, statisch, schwach, strukturell,[5][6] nominal |
Implementierungssprache | Gehen, Montagesprache (GC); C ++ (Gofrontend) |
OS | Libelle BSD, Freebsd, Linux, Mac OS, Netbsd, OpenBSD,[7] Plan 9,[8] Solaris, Fenster |
Lizenz | 3-Klausel BSD[3] + Patent gewähren[9] |
Dateiname -Erweiterungen | .gehen |
Webseite | gehen |
Haupt Implementierungen | |
GC, Gofrontend | |
Beeinflusst von | |
C, Oberon-2, Limbo, Aktiver Oberon, Kommunizieren von sequentiellen Prozessen, Pascal, Oberon, Smalltalk, Newsqueak, Modula-2, ALEF, Apl, BCPL, Modula, occam | |
Beeinflusst | |
Odin, Kristall, Zick |
gehen ist ein statisch typisiert, zusammengestellt Programmiersprache entworfen bei Google[10] durch Robert Griesemer, Rob Pike, und Ken Thompson.[11] es ist syntaktisch ähnlich zu C, aber mit Speichersicherheit, Müllsammlung, strukturelle Typisierung,[5] und CSP-Stil Parallelität.[12] Es wird oft als als bezeichnet Golang Wegen seines früheren Domainnamens, golang.org
, aber sein richtiger Name ist Go.[13]
Es gibt zwei wichtige Implementierungen:
- Google Selbsthosting[14] "GC" Compiler Toolchainmit mehreren Targeting Betriebssysteme und WebAssembly.[15]
- Gofrontend, ein Frontend für andere Compiler, mit dem libgo Bibliothek. Mit GCC Die Kombination ist GCCGO;[16] mit Llvm Die Kombination ist gollvm.[17][a]
Ein Dritter Source-to-Source-Compiler, Gopherjs,[19] compiles gehen zu JavaScript zum Front-End-Webentwicklung.
Geschichte
Go wurde entworfen bei Google im Jahr 2007, um sich zu verbessern Programmierungsproduktivität in einer Ära von Multicore, vernetzt Maschinen und groß Codebasen.[20] Die Designer wollten die Kritik an anderen bei Google verwendeten Sprachen ansprechen, behalten jedoch ihre nützlichen Merkmale:[21]
- Statische Typisierung und Laufzeit Effizienz (wie C)
- Lesbarkeit und Benutzerfreundlichkeit (wie Python oder JavaScript)[22]
- Hochleistung Networking und Multiprozessierung
Seine Designer wurden hauptsächlich durch ihre gemeinsame motiviert Abneigung gegen C ++.[23][24][25]
Go wurde im November 2009 öffentlich angekündigt,[26] und Version 1.0 wurde im März 2012 veröffentlicht.[27][28] Go wird in der Produktion bei Google häufig verwendet[29] und in vielen anderen Organisationen und Open-Source-Projekten.
Im November 2016 wurden die Go and Go Mono -Schriftarten von Typdesigern veröffentlicht Charles Bigelow und Kris Holmes speziell für die Verwendung durch das Go -Projekt. Go ist a Humanistischer Sans-Serif ähneln Lucida Grandeund go mono ist monospasiert. Beide Schriftarten haften an die WGL4 Charakter -Set und wurden als lesbar mit einem großen ausgelegt x-hohe und unterschiedlich Briefformen. Beide gehen und gehen mono haften an die LÄRM 1450 Standard durch eine zerkleinerte Null, Kleinbuchstaben l
mit einem Schwanz und einem Großbuchstaben I
mit Serifen.[30][31]
Im April 2018 wurde das ursprüngliche Logo durch einen stilisierten GO -Rang mit nachfolgenden Stromlinien ersetzt. (Das Gopher Maskottchen blieb gleich.[32]))
Generika
Die mangelnde Unterstützung für generische Programmierung In anfänglichen Versionen von Go zog erhebliche Kritik.[33] Die Designer drückten eine Offenheit für die generische Programmierung aus und stellten fest, dass integrierte Funktionen war in der Tat Typ-Generikat, werden aber als Sonderfälle behandelt; Pike nannte dies eine Schwäche, die irgendwann geändert werden könnte.[34] Das Google -Team baute mindestens einen Compiler für einen experimentellen GO -Dialekt mit Generika auf, gab es jedoch nicht frei.[35]
Im August 2018 veröffentlichte die GO Principal -Mitwirkenden Entwürfe von Entwürfen für generische Programme und Fehlerbehandlung und forderte Benutzer auf, Feedback einzureichen.[36][37] Der Vorschlag für Fehlerbehelden wurde jedoch schließlich aufgegeben.[38]
Im Juni 2020 ein neues Entwurfsdesigndokument[39] wurde veröffentlicht, das die erforderliche Syntax für die Erklärung generischer Funktionen und Typen hinzufügen würde. Ein Codeübersetzungstool, Go2go, wurde bereitgestellt, damit Benutzer die neue Syntax sowie eine generikfähige Version des Online-Go-Playgrounds ausprobieren können.[40]
Generika wurden schließlich in Version 1.18 hinzugefügt.[41]
Versioning
Gehen Sie 1 garantiert die Kompatibilität[42] Für die Sprachspezifikation und die wichtigsten Teile der Standardbibliothek. Alle Versionen bis zur aktuellen GO 1.19 -Version[43] habe dieses Versprechen beibehalten.
Jede Hauptveröffentlichung wird unterstützt, bis zwei neuere Hauptveröffentlichungen vorhanden sind.[44]
Veröffentlichung | Status | Veröffentlichungsdatum | Wartungsende |
---|---|---|---|
Go1 | Lebensende | 2012-03-28 | 2013-12-01 |
Go1.1 | Lebensende | 2013-05-13 | 2014-06-18 |
Go1.2 | Lebensende | 2013-12-01 | 2014-12-10 |
Go1.3 | Lebensende | 2014-06-18 | 2015-08-19 |
Go1.4 | Lebensende | 2014-12-10 | 2016-02-17 |
Go1.5 | Lebensende | 2015-08-19 | 2016-08-15 |
Go1.6 | Lebensende | 2016-02-17 | 2017-02-16 |
Go1.7 | Lebensende | 2016-08-15 | 2017-08-24 |
Go1.8 | Lebensende | 2017-02-16 | 2018-02-16 |
Go1.9 | Lebensende | 2017-08-24 | 2018-08-24 |
Go1.10 | Lebensende | 2018-02-16 | 2019-02-25 |
Go1.11 | Lebensende | 2018-08-24 | 2019-09-03 |
Go1.12 | Lebensende | 2019-02-25 | 2020-02-25 |
Go1.13 | Lebensende | 2019-09-03 | 2020-08-11 |
Go1.14 | Lebensende | 2020-02-25 | 2021-02-16 |
Go1.15 | Lebensende | 2020-08-11 | 2021-08-16 |
Go1.16 | Lebensende | 2021-02-16 | 2022-03-15 |
Go1.17 | Lebensende | 2021-08-16 | 2022-08-02 |
Go1.18 | Wartung | 2021-08-16 | Q1 2023 |
Go1.19 | Aktuell | 2022-08-02 | Q3 2023 |
Go1.20 | Geplant | Q1 2023 | Q1 2024 |
Legende: Alte Version Ältere Version, noch gepflegt Letzte Version Zukünftige Veröffentlichung |
Entwurf
Go wird beeinflusst von C (insbesondere das Plan 9 Dialekt[45][Fehlgeschlagene Überprüfung – Siehe Diskussion]), aber mit Schwerpunkt auf größerer Einfachheit und Sicherheit. Es besteht aus:
- Eine Syntax und eine Umgebung, die Muster übernimmt Dynamische Sprachen:[46]
- - optionale prägnante Variablendeklaration und Initialisierung durch Geben Sie Inferenz ein (
x: = 0
Anstatt vonint x = 0;
odervar x = 0;
) - - Schnelle Zusammenstellung[47]
- - Remote -Paket -Management (
geh holen
)[48] und Online -Paketdokumentation[49]
- Unterscheidungsmerkmale für bestimmte Probleme:
- -Eingebaute Parallelitätsprimitive: Leichte Prozesse (Goroutines), Kanäle, und die
auswählen
Aussage - - Ein Schnittstelle System anstelle von Virtuelle Vererbungund Typeinbettung anstelle eines nicht virtuellen Vererbung
- - Eine Toolchain, die standardmäßig erzeugt statisch verknüpft Einheimische Binärdateien ohne externe Abhängigkeiten
- Der Wunsch, die Sprachspezifikation einfach genug zu halten, um den Kopf eines Programmierers zu halten,[50] teilweise durch Merkmale weglassen, die in ähnlichen Sprachen üblich sind.
Syntax
Die Syntax von Go enthält Änderungen von C Ziel, Code präzise und lesbar zu halten. Ein kombinierter Deklarations-/Initialisierungsoperator wurde eingeführt, mit dem der Programmierer schreiben kann I: = 3
oder S: = "Hallo, Welt!"
, ohne die Typen anzugeben von verwendeten Variablen. Dies steht im Gegensatz zu C's int i = 3;
und const char *s = "Hallo, Welt!";
. Semikolone beenden noch Aussagen;[b] sind aber implizit, wenn das Ende einer Linie auftritt.[c] Methoden können mehrere Werte zurückgeben und a zurückgeben Ergebnis, ähm
Paar ist die herkömmliche Art und Weise, wie eine Methode einen Fehler für seinen Anrufer in Go angibt.[d] Go fügt wörtliche Syntaxe zum Initialisieren von Strukturparametern und zum Initialisieren hinzu Karten und Scheiben. Als Alternative zu Cs Drei-An-Drei-An-Angaben zum
Schleife, Go's Angebot
Ausdrücke ermöglichen eine kurze Iteration über Arrays, Scheiben, Zeichenfolgen, Karten und Kanäle.[53]
Typen
Go hat eine Reihe von integrierten Typen, einschließlich numerischer (Byte, INT64, float32, etc.), Booleschen, und Charakter Strings (Saite). Saiten sind unveränderlich; Eingebaute Operatoren und Schlüsselwörter (anstatt Funktionen) liefern Verkettung, Vergleich und UTF-8 verschlüsseln entschlüsseln.[54] Datensatztypen kann mit dem definiert werden Struktur Stichwort.[55]
Für jeden Typ T und jede nicht negative Ganzzahlkonstante n, Da ist ein Array -Typ bezeichnet [n]T; Arrays unterschiedlicher Längen sind somit unterschiedliche Typen. Dynamische Arrays sind als "Scheiben" erhältlich, bezeichnet []T für irgendeine Art T. Diese haben eine Länge und a Kapazität Angeben, wann ein neuer Speicher zugewiesen werden muss, um das Array zu erweitern. Mehrere Scheiben können ihren zugrunde liegenden Speicher teilen.[34][56][57]
Zeiger sind für alle Typen und der Zeiger aufT Typ ist bezeichnet *T. Adressaufnahme und Indirektion verwenden Sie die & und * Operatoren, wie in C oder implizit über die Methode Call- oder Attributzugriffssyntax auftreten.[58][59] Es gibt keine Zeigerarithmetik,[e] außer über die Special unsicher.pointer Geben Sie die Standardbibliothek ein.[60]
Für ein Paar Typen K, V, der Typ Karte[K]V ist die Art von Hash -Tische Mapping-Typ-K Schlüssel zum Typen-V Werte. Hash-Tabellen sind in die Sprache mit speziellen Syntax- und integrierten Funktionen integriert. Chan T ist ein Kanal Das ermöglicht das Senden von Werten vom Typ T zwischen Gleichzeitige GO -Prozesse.[61]
Abgesehen von seiner Unterstützung für Schnittstellen, Go's Types System ist nominal: das Typ Schlüsselwort kann verwendet werden, um eine neue zu definieren genannt Typ, was sich von anderen benannten Typen unterscheidet, die das gleiche Layout haben (im Fall von a Struktur, die gleichen Mitglieder in der gleichen Reihenfolge). Einige Konvertierungen zwischen Typen (z. B. zwischen den verschiedenen Ganzzahltypen) sind vordefiniert, und das Hinzufügen eines neuen Typs kann zusätzliche Konvertierungen definieren, aber Conversions zwischen benannten Typen müssen immer explizit aufgerufen werden.[62] Zum Beispiel die Typ Schlüsselwort kann verwendet werden, um einen Typ für zu definieren IPv4 Adressen, basierend auf 32-Bit-nicht signierten Ganzzahlen:
Typ IPv4Addr Uint32
Mit dieser Typdefinition, ipv4addr (x) interpretiert die Uint32 Wert x als IP -Adresse. Einfach zuweisen x zu einer Variablen vom Typ IPv4Addr ist ein Typfehler.[63]
Konstante Ausdrücke können entweder tippt oder "nicht typisiert" werden; Sie erhalten einen Typ, wenn sie einer typisierten Variablen zugeordnet sind, wenn der Wert, den sie darstellen, eine Kompilierungs-Zeit-Prüfung bestehen.[64]
Funktion Typen werden durch die angezeigt Func Stichwort; Sie nehmen Null oder mehr Parameter und Rückkehr Null oder mehr Werte, die alle tippt werden. Der Parameter und die Rückgabewerte bestimmen einen Funktionstyp; daher, func (String, int32) (int, fehler) ist die Art von Funktionen, die a nehmen Saite und eine mit 32-Bit signierte Ganzzahl und geben eine signierte Ganzzahl (von Standardbreite) und einen Wert des integrierten Schnittstellentyps zurück Error.[65]
Jeder benannte Typ hat a Methode damit verbunden sein. Das obige IP -Adressbeispiel kann mit einer Methode erweitert werden, um zu überprüfen, ob sein Wert ein bekannt ist:
// Zerobroadcast berichtet, ob ADDR 255.255.255.255 ist. Func (ADDR IPv4Addr) Zerobroadcast() bool { Rückkehr ADDR == 0xffffffff }
Aufgrund der nominalen Typisierung fügt diese Methode Definition eine Methode hinzu zu IPv4Addr, aber nicht auf Uint32. Während Methoden eine spezielle Definition und Aufrufsyntax haben, gibt es keinen unterschiedlichen Methodentyp.[66]
Schnittstellensystem
Go bietet zwei Funktionen, die ersetzen Klassenvererbung.
Das erste ist Einbettung, was als automatisierte Form von angesehen werden kann Komposition.[67]
Die zweite sind seine Schnittstellen, der bereitstellt Laufzeitpolymorphismus.[68]: 266 Schnittstellen sind eine Klasse von Typen und bieten eine begrenzte Form von strukturelle Typisierung im ansonsten nominalen Typ von GO. Ein Objekt, das von einem Schnittstellentyp ist, ist ebenfalls von einem anderen Typ, ähnlich wie C ++ Objekte sind gleichzeitig aus einer Basis und einer abgeleiteten Klasse. GO -Schnittstellen wurden danach entworfen Protokolle Aus der SmallTalk -Programmiersprache.[69] Mehrere Quellen verwenden den Begriff Ententypisierung Bei der Beschreibung von GO -Schnittstellen.[70][71] Obwohl der Begriff Ententypisierung nicht genau definiert ist und daher nicht falsch ist, bedeutet dies normalerweise, dass die Typ -Konformität nicht statisch überprüft wird. Da die Konformität mit einer GO -Schnittstelle vom Go -Compiler statisch überprüft wird (außer bei der Ausführung einer Typbehauptung), bevorzugen die Go -Autoren den Begriff strukturelle Typisierung.[72]
Die Definition eines Schnittstellentyps listet die erforderlichen Methoden nach Namen und Typ auf. Jedes Objekt vom Typ t, für das Funktionen existieren, die alle erforderlichen Methoden des Schnittstellentyps I übereinstimmen, ist auch ein Objekt vom Typ I. Die Definition von Typ t muss Typ I nicht (und nicht identifizieren). Zum Beispiel, wenn Form, Quadrat und Kreis werden definiert als
importieren "Mathematik" Typ Form Schnittstelle { Bereich() float64 } Typ Quadrat Struktur { // Hinweis: Keine "implementierende" Deklaration Seite float64 } Func (sq Quadrat) Bereich() float64 { Rückkehr sq.Seite * sq.Seite } Typ Kreis Struktur { // Auch hier keine "implementierende" Deklaration Radius float64 } Func (c Kreis) Bereich() float64 { Rückkehr Mathematik.Pi * Mathematik.POW(c.Radius, 2) }
Dann beide a Quadrat und ein Kreis sind implizit a Form und kann a zugewiesen werden Form-Typ Variable.[68]: 263–268 In der formalen Sprache bietet das Schnittstellensystem von Go strukturell statt nominal Typisierung. Schnittstellen können andere Schnittstellen mit dem Effekt der Erstellung einer kombinierten Schnittstelle einbetten, die genau den Typen, die die eingebettete Schnittstelle implementieren, und alle Methoden, die die neu definierte Schnittstelle hinzufügt, erfüllt ist.[68]: 270
Die GO -Standardbibliothek verwendet Schnittstellen, um Generität an mehreren Stellen bereitzustellen, einschließlich des Eingabe-/Ausgabesystems, das auf den Konzepten von basiert Leser und Schriftsteller.[68]: 282–283
Neben Schnittstellen können Sie nicht nur Methoden aufrufen, sondern ermöglicht das Konvertieren von Schnittstellenwerten in andere Typen mit einer Überprüfung des Laufzeittyps. Die Sprachkonstrukte dazu sind die Geben Sie die Behauptung ein,[73] welche über einen einzelnen potenziellen Typ und die überprüft, und die Typ Schalter,[74] welche über mehrere Typen überprüft.
Das leere Schnittstelle Schnittstelle{}
ist ein wichtiger Basisfall, da er sich auf einen Gegenstand von beziehen kann irgendein Betontyp. Es ähnelt dem Objekt Klasse in Java oder C# und ist mit irgendeiner Art zufrieden, einschließlich eingebauter Typen wie int.[68]: 284 Der Code, der die leere Schnittstelle verwendet Schnittstelle{}
Wert, versuchen Sie, es über eine Typbehandlung in einen nützlicheren Typ umzuwandeln oder Schalter zu tippen, oder überprüfen Sie ihn mit GO's reflektieren
Paket.[75] Da Schnittstelle{}
Kann sich auf jeden Wert beziehen, es ist eine begrenzte Möglichkeit, den Einschränkungen der statischen Typisierung zu entkommen, wie Leere*
in C, aber mit zusätzlichen Überprüfungen zum Laufzeittyp.
Das Schnittstelle{}
Typ kann verwendet werden, um strukturierte Daten eines beliebigen Schemas in Go zu modellieren, wie z. JSON oder Yaml Daten, indem sie es darstellen als Karte [String] Schnittstelle {}
(Karte der Zeichenfolge zu leerer Schnittstelle). Dies beschreibt Daten in Form eines Wörterbuchs mit Stringschlüssel und Werten jeglicher Art.[76]
Die Schnittstellenwerte werden mit Zeiger auf Daten und einem zweiten Zeiger auf Informationen zum Laufzeittyp implementiert.[77] Wie einige andere Typen, die mit Zeigern in GO implementiert sind, sind Schnittstellenwerte Null
Wenn nicht initialisiert.[78]
Generischer Code mit parametrisierten Typen
Seit Version 1.18 unterstützt GO den generischen Code unter Verwendung parametrisierter Typen.[79]
Paketsystem
In Go's Package System hat jedes Paket einen Pfad (z. B.,, "Compress/BZIP2"
oder "golang.org/x/net/html"
) und ein Name (z. B.,, BZIP2
oder html
). Verweise auf die Definitionen anderer Pakete müssen stets mit dem Namen des anderen Pakets und nur dem vorangestellt werden aktiviert Namen aus anderen Paketen sind zugänglich: io.reader
ist aber öffentlich BZIP2.Reader
ist nicht.[80] Das geh holen
Der Befehl kann Pakete abrufen, die in einem Remote -Repository gespeichert sind[81] und Entwickler werden ermutigt, Pakete in einem Basispfad zu entwickeln, das einem Quell -Repository (z. B. Beispiel.com/user_name/package_name) entspricht, um die Wahrscheinlichkeit der Kollision mit zukünftigen Ergänzungen in der Standardbibliothek oder in anderen externen Bibliotheken zu verringern.[82]
Parallelität: Goroutinen und Kanäle
Die Go-Sprache verfügt über integrierte Einrichtungen sowie die Unterstützung der Bibliothek zum Schreiben gleichzeitige Programme. Parallelität bezieht sich nicht nur auf die CPU -Parallelität, sondern auch auf die CPU Asynchronität: Lassen Sie langsame Vorgänge wie eine Datenbank oder ein Netzwerk lesen, während das Programm andere Arbeiten erledigt, wie dies auf ereignisbasierten Servern üblich ist.[83]
Das primäre Parallelitätskonstrukt ist das Goroutine, Eine Art von Leichter Prozess. Ein Funktionsaufruf, der mit dem vorangestellt ist gehen
Schlüsselwort startet eine Funktion in einer neuen Goroutine. In der Sprachspezifikation wird nicht angegeben, wie Goroutines implementiert werden sollen, aber aktuelle Implementierungen Multiplex und Goroutinen des GO -Prozesses auf einen kleineren Satz von Betriebssystemfäden, ähnlich wie bei der Zeitplanung in Erlang.[84]: 10
Während ein Standardbibliothekspaket mit dem größten Teil der Klassik Parallelitätskontrolle Strukturen (Mutex Schlösser usw.) ist verfügbar,[84]: 151–152 Idiomatische gleichzeitige Programme bevorzugen stattdessen Kanäle, die Sende Nachrichten zwischen Goroutinen.[85] Optionale Puffer speichern Nachrichten in FIFO bestellen[86]: 43 und erlauben Sie das Senden von Goroutines, bevor ihre Nachrichten empfangen werden.
Kanäle werden tippt, so dass ein Typkanal Chan T kann nur verwendet werden, um Nachrichten vom Typ zu übertragen T. Spezielle Syntax wird verwendet, um sie zu betreiben. <-ch ist ein Ausdruck, der dazu führt, dass die ausführende Goroutine blockiert, bis ein Wert über den Kanal kommt CH, während ch <- x sendet den Wert x (Möglicherweise blockieren Sie, bis eine andere Goroutine den Wert erhält). Das eingebaute Schalter-wie auswählen Die Anweisung kann verwendet werden, um nicht blockierende Kommunikation auf mehreren Kanälen zu implementieren. sehen unter zum Beispiel. Go hat ein Speichermodell, das beschreibt, wie Goroutines Kanäle oder andere Vorgänge verwenden müssen, um Daten sicher zu teilen.[87]
Die Existenz von Kanälen setzt abseits ab Schauspielermodell-Stil gleichzeitige Sprachen wie Erlang, wobei Nachrichten direkt an Akteure gerichtet sind (entsprechend Goroutinen). Der Schauspielerstil kann durch die Aufrechterhaltung einer Eins-zu-Eins-Korrespondenz zwischen Goroutinen und Kanälen simuliert werden. Die Sprache ermöglicht es jedoch, dass mehrere Goroutinen einen Kanal oder eine einzelne Goroutine teilen und auf mehrere Kanäle empfangen können.[84]: 147
Aus diesen Tools kann man gleichzeitige Konstrukte wie Arbeiterpools, Pipelines (beispielsweise eine Datei beim Download analysiert) erstellen .[88] Kanäle haben auch als weiteren Begriff der Interprozesskommunikation als eine unterhaltsame Liste von recycelten Puffern verwendet, die weiter verwendet wurden.[89] Implementierung Coroutinen (was dazu beigetragen hat, den Namen zu inspirieren Goroutine),[90] und implementieren Iteratoren.[91]
Gleichzeitige strukturelle Konventionen von GO (Kanäle und alternative Kanaleingaben) werden abgeleitet von Tony Hoare Kommunizieren von sequentiellen Prozessen Modell. Im Gegensatz zu früheren gleichzeitigen Programmiersprachen wie z. Occam oder Limbo (Eine Sprache, auf der Go-Designer Rob Pike arbeitete),[92] GO liefert keinen integrierten Begriff einer sicheren oder überprüfbaren Parallelität.[93] Während das Modell der Kommunikationsprozesse in Go bevorzugt wird, ist es nicht das einzige: Alle Goroutinen in einem Programm teilen einen einzigen Adressraum. Dies bedeutet, dass veränderliche Objekte und Zeiger zwischen Goroutinen geteilt werden können; sehen § Mangel an Sicherheit von Rassenzustandssicherheit, unter.
Eignung für die parallele Programmierung
Obwohl die Parallelitätsfunktionen von Go nicht hauptsächlich auf das Ziel sind Parallelverarbeitung,[83] Sie können verwendet werden, um zu programmieren geteilte Erinnerung Mehrprozessor Maschinen. Es wurden verschiedene Studien zur Wirksamkeit dieses Ansatzes durchgeführt.[94] Eine dieser Studien verglichen die Größe (in Zeilen von Code) und Geschwindigkeit von Programmen, die von einem erfahrenen Programmierer geschrieben wurden, der mit der Sprache und den Korrekturen dieser Programme von einem Go -Experten (aus Googles Entwicklungsteam) nicht vertraut ist, tun dasselbe für Kapelle, Cilk und Intel TBB. Die Studie ergab, dass der Nicht-Experte dazu tendierte zu schreiben Divide-and-Conquer Algorithmen mit einem gehen Aussage pro Rekursion, während der Experte mit einer Goroutine pro Prozessor verteilte-synchronisierte Programme schrieb. Die Programme des Experten waren normalerweise schneller, aber auch länger.[95]
Mangel an Rennbedingung für die Sicherheit
GOs Ansatz zur Parallelität kann als "Nicht kommunizieren Sie durch das Teilen von Gedächtnissen durch die Kommunikation" zusammengefasst werden.[96] Es gibt keine Einschränkungen dafür Rennbedingungen möglich. Insbesondere, es sei denn, ein Programm synchronisiert über Kanäle oder andere Mittel, die von einer Go-Routine teilnehmen können, kann teilweise, vollständig oder überhaupt nicht für eine andere sichtbar sein, oft ohne Garantien für die Bestellung von Schreibvorgängen.[93] Außerdem ist Go's Interne Datenstrukturen Wie Schnittstellenwerte sind Schnittheader, Hash -Tabellen und String -Header nicht gegen Rennbedingungen immun, sodass Typen und Speichersicherheit in Multithread -Programmen verletzt werden können, die gemeinsame Instanzen dieser Typen ohne Synchronisation ändern.[97][98] Anstelle von Sprachunterstützung beruht eine sichere gleichzeitige Programmierung somit auf Konventionen. Zum Beispiel empfiehlt Chisnall eine Idiom namens "Aliase xor Veränderlich ", was bedeutet, dass über einen Kanal über einen Kanal ein Veränderungswert (oder Zeiger) übertragen wird, signalisiert eine Übertragung von Eigentum über den Wert an seinen Empfänger.[84]: 155
Binärdateien
Der Linker in der GC Toolchain erstellt staatlich verknüpfte Binärdateien standardmäßig. Daher umfassen alle Go -Binärdateien die GO -Laufzeit.[99][100]
Auslassungen
Gehen Sie absichtlich bestimmte Merkmale aus, die in anderen Sprachen üblich sind, einschließlich (Implementierung) Vererbung, Behauptungen,[f] Zeigerarithmetik,[e] implizite Typkonvertierungen, Untagte Gewerkschaften,[g] und Markierte Gewerkschaften.[h] Die Designer fügten nur die Einrichtungen hinzu, auf die sich alle drei einigten.[103]
Von den ausgelassenen Sprachmerkmalen sprechen die Designer ausdrücklich gegen Behauptungen und Zeiger -Arithmetik Schnittstellen erreichen Dynamischer Versand[ich] und Komposition Code wiederverwenden. Zusammensetzung und Delegation sind in der Tat weitgehend automatisiert von Struktur Einbettung; Laut Forschern Schmager et al.Dieses Merkmal "hat viele Nachteile der Vererbung: Es beeinflusst die öffentliche Schnittstelle von Objekten, es ist nicht feinkörnig (d. H. Keine Kontrolle über Methodenebene über Einbetten), Methoden eingebetteter Objekte können nicht versteckt werden und es ist statisch "," nicht offensichtlich ", ob Programmierer es in dem Maße überbeanspruchen, in dem Programmierer in anderen Sprachen als Überbeanspruchung der Erbschaft angeboten werden.[67]
Ausnahmebehandlung wurde zunächst in Go weggelassen, weil ein "Design proportional zur Komplexität proportional ist".[104] Ein außergewöhnliches Panik/genesen Mechanismus, der das Übliche vermeidet Versuch
Die Kontrollstruktur wurde vorgeschlagen[105] und im Snapshot am 30. März 2010 veröffentlicht.[106] Die GO -Autoren empfehlen es, es für nicht wiedervertragbare Fehler zu verwenden, wie z.[107][108] Über Paketgrenzen hinweg enthält Go einen kanonischen Fehlertyp, und Multi-Wert-Rücksendungen mit diesem Typ sind die Standard-Idiom.[11]
Stil
Die GO -Autoren haben erhebliche Anstrengungen unternommen, um den Stil der GO -Programme zu beeinflussen:
- Eindrückung, Abstand und andere Details des Code auf Oberflächenebene werden automatisch durch die standardisiert
gofmt
Werkzeug. Es verwendet Registerkarten für Einrückung und Rohlinge für die Ausrichtung. Aus der Ausrichtung geht davon aus, dass ein Editor eine Schriftart mit fester Breite verwendet.[109]Golint
Funktioniert zusätzliche Stilprüfungen automatisch, wurde jedoch von den Go -Wartenden veraltet und archiviert.[110] - Tools und Bibliotheken, die mit GO verteilt sind, schlagen Standardansätze für Dinge wie API -Dokumentation vor (
Godoc
),[111] testen (Gehen Sie Test
), Gebäude (Geh bauen
), Paketverwaltung (geh holen
), usw. - GO erzwingt Regeln, die Empfehlungen in anderen Sprachen sind, z. B. Bieten von zyklischen Abhängigkeiten, nicht verwendete Variablen[112] oder Importe,[113] und implizite Typkonvertierungen.
- Das Unterlassung von bestimmten Merkmalen (z.
Karte
und Java-StilVersuchen
/endlich
Blöcke) neigt dazu, einen bestimmten expliziten, konkreten und imperativen Programmierstil zu fördern. - Am ersten Tag veröffentlichte das Go -Team eine Sammlung von Go Idioms,[111] und später auch Code -Review -Kommentare, Kommentare,[114] Gespräche,[115] und offizielle Blog -Beiträge[116] GO -Stil- und Codierungsphilosophie lehren.
Werkzeug
Die Hauptverteilung umfasst Tools für Gebäude, testen, und Analysieren Code:
-
Geh bauen
, die GO -Binärdateien mit nur Informationen in den Quelldateien selbst erstellt, keine separaten Makefiles -
Gehen Sie Test
, für Einheitentests und Mikrobenchmarks -
Geh fmt
zum Formatieren von Code -
Installieren Sie
Zum Abrufen und Installieren von Remotepaketen -
Gehen Sie Tierarzt
, ein statischer Analysator, der nach möglichen Codefehlern sucht -
geh Rennen
, eine Abkürzung zum Erstellen und Ausführen von Code -
Godoc
zum Anzeigen von Dokumentationen oder zum Servieren über http -
Gorename
zum Umbenennen von Variablen, Funktionen usw. auf Typ-Sicherheit -
Gehen Sie erzeugen
, eine Standardmethode, um Codegeneratoren aufzurufen -
MOD
zum Erstellen eines neuen Moduls, zum Hinzufügen von Abhängigkeiten, zum Upgrade von Abhängigkeiten usw.
Es beinhaltet auch Profilerstellung und Debuggen Unterstützung, Laufzeit Instrumentierung (zum Beispiel zu verfolgen Müllsammlung Pausen) und a Rassenbedingung Tester.
Ein Ökosystem von Tools von Drittanbietern erhöht die Standardverteilung, wie z. Gocode
, was die automatische Vervollständigung von Code in vielen Textredakteuren ermöglicht, Goimports
, was automatisch Paketimporte nach Bedarf hinzufügt/entfernt und Errcheck
, der Code erkennt, der Fehler unbeabsichtigt ignorieren könnte.
Beispiele
Hallo Welt
Paket hauptsächlich importieren "fmt" Func hauptsächlich() { fmt.Println("Hallo Welt") }
wo "fmt" das Paket ist für formatiert I/o, ähnlich wie C C Dateieingabe/Ausgabe.[117]
Parallelität
Das folgende einfache Programm zeigt Go's Parallelitätsmerkmale Um ein asynchrones Programm zu implementieren. Es startet zwei leichte Threads ("Goroutines"): Einer wartet darauf, dass der Benutzer einen Text eingibt, während der andere eine Zeitüberschreitung implementiert. Das auswählen Die Erklärung wartet darauf, dass eine dieser Goroutines eine Nachricht an die Hauptroutine sendet, und wirkt auf die erste Nachricht (Beispiel angepasst aus David Chisnalls Buch).[84]: 152
Paket hauptsächlich importieren ( "fmt" "Zeit" ) Func LESSWORT(CH Chan Saite) { fmt.Println("Geben Sie ein Wort ein, drücken Sie dann Eingabe.") var Wort Saite fmt.Scanf("%s", &Wort) CH <- Wort } Func Auszeit(t Chan bool) { Zeit.Schlafen(5 * Zeit.Zweite) t <- FALSCH } Func hauptsächlich() { t : = machen(Chan bool) gehen Auszeit(t) CH : = machen(Chan Saite) gehen LESSWORT(CH) auswählen { Fall Wort : = <-CH: fmt.Println("Erhalten", Wort) Fall <-t: fmt.Println("Auszeit.") } }
Testen
Das Testpaket bietet Unterstützung für automatisierte Tests von GO -Paketen.[118] Beispiel für Zielfunktion:
Func Extraktusername(Email Saite) Saite { bei : = Saiten.Index(Email, "@") Rückkehr Email[:bei] }
Testcode (beachten Sie das behaupten Schlüsselwort fehlt in Go; Tests live in <FileName> _test.go im selben Paket):
importieren ( "testen" ) Func TESTEXTRACTUSERNAME(t *testen.T) { t.Laufen("Ohnedot", Func(t *testen.T) { Nutzername : = Extraktusername("[email protected]") wenn Nutzername ! = "r" { t.Tödlich("Got: %v \ n", Nutzername) } }) t.Laufen("Withot", Func(t *testen.T) { Nutzername : = Extraktusername("[email protected]") wenn Nutzername ! = "Jonh.smith" { t.Tödlich("Got: %v \ n", Nutzername) } }) }
Es ist möglich, Tests parallel durchzuführen.
Web-App
Das NET/HTTP -Paket bietet Unterstützung für das Erstellen von Webanwendungen.
Dieses Beispiel würde "Hallo Welt!" Zeigen, Wenn Localhost: 8080 besucht wird.
Paket hauptsächlich importieren ( "fmt" "Protokoll" "net/http" ) Func Hellofunc(w http.Antwortschreiber, r *http.Anfrage) { fmt.Fprintf(w, "Hallo Welt!") } Func hauptsächlich() { http.Handlefunc("/", Hellofunc) Protokoll.Tödlich(http.Hörenserve(": 8080", Null)) }
Anwendungen
Einige bemerkenswert Open Source Bewerbungen in Go gehören:[119]
- Caddie, ein Open -Source -HTTP/2 -Webserver mit automatischer HTTPS -Fähigkeit
- Kakerlachdb, eine Open Source, überlebensfähige, stark konsistente, skalierende SQL-Datenbank
- Konsul, eine Software für DNS-basierte Serviceerkennung und Bereitstellung verteilter Schlüsselwertspeicher, Segmentierung und Konfiguration.
- Docker, eine Reihe von Tools für die Bereitstellung Linux Behälter
- Edgex, eine von der Hersteller-neutrale Open-Source-Plattform, die von der veranstaltet wird Linux Foundationeinen gemeinsamen Rahmen für Industrial IoT Edge Computing[120]
- Hugo, ein statischer Site -Generator
- InfluxDB, eine Open -Source -Datenbank speziell, um Zeitreihendaten mit hoher Verfügbarkeit und hohen Leistungsanforderungen zu verarbeiten
- Interplanetäres Dateisystem, ein inhaltsadressibles Peer-to-Peer-Hypermedia-Protokoll[121]
- Juju, ein Service Orchestration -Tool von Kanonisch, Verpacker von Ubuntu Linux
- Kubernetes Containermanagementsystem
- lnd eine Implementierung der Bitcoin Blitznetzwerk[122]
- Materie, ein Teamchat -System
- Nats Messaging, ein Open-Source-Messaging-System mit den Grundprinzipien der Kerngestaltung von Leistung, Skalierbarkeit und Benutzerfreundlichkeit[123]
- OpenShift, eine Cloud -Computing -Plattform als Dienst von roter Hut
- RCLone, ein Befehlszeilenprogramm zum Verwalten von Dateien im Cloud -Speicher und anderen Latenzdiensten
- Bissig, ein Paketmanager für Ubuntu Touch entwickelt von Kanonisch
- Synchronisieren, eine Open-Source-Datei-Synchronisierungs-Client/Serveranwendung
- Terraform, eine Open-Source, mehrere Wolke Infrastrukturbereitstellungsinstrument von Hashicorp
- Tidb, eine Open-Source, verteilt HTAP Datenbank kompatibel mit dem MySQL -Protokoll von PingCap
- Arctil, Tool zur Bewertung von Websicherheit [124]
Andere bemerkenswerte Unternehmen und Websites verwenden GO (im Allgemeinen zusammen mit anderen Sprachen, nicht ausschließlich):
- Kakoofür die Darstellung der Benutzer -Dashboard -Seite und Microservice mit GO und GRPC[125]
- Chango, ein programmatisches Werbeunternehmen verwendet GO in seinen Echtzeit-Gebotssystemen[126]
- Wolkengießerei, a Plattform als Dienst[127]
- Wolkenflare, für ihre Delta-kodierenden Proxy Railgun, ihren verteilten DNS-Service sowie Tools für Kryptographie, Protokollierung, Stream-Verarbeitung und Zugriff auf SPDY-Websites[128][129]
- Container Linux (ehemals CoreOS), ein Linux-basiertes Betriebssystem, das verwendet Docker Behälter[130] und rkt Behälter
- Couchbase, Abfragen- und Indizierungsdienste innerhalb des Couchbase -Servers[131]
- Dropbox, der einige ihrer kritischen Komponenten von Python migrierte, um zu gehen[132]
- Äther, Das Go-Ehereum Implementierung des Blockchains Virtual Machine für die Ethereum für die Äther Kryptowährung[133]
- Gitlab, a webbasiert DevOps Lebenszykluswerkzeug, das a bietet Git-Repository, Wiki, Fehlersuche, kontinuierliche Integration, Einsatz Pipeline -Funktionen[134]
- Googlefür viele Projekte, insbesondere einschließlich Download Server dl.google.com[135][136][137]
- Heroku, für Doozer, einen Lock -Service[12]
- Hyperledger -Stoff, eine Open Source, Enterprise-Fokussierung verteiltes Ledger-Projekt
- MongoDB, Tools zur Verwaltung von MongoDB -Instanzen[138]
- Netflixfür zwei Teile ihrer Serverarchitektur[139]
- Nutanixfür eine Vielzahl von Mikrodiensten in seinem Enterprise Cloud-Betriebssystem[140]
- Plug.dj, eine interaktive Online -Social Music -Streaming -Website[141]
- Sendgrid, ein in Boulder, Colorado ansässiger Transaktions-E-Mail-Zustellung und -verwaltungsdienst.[142]
- Soundcloud, für "Dutzende von Systemen"[143]
- Spleißenfür das gesamte Backend (API und Parser) ihrer Online -Musikkollaborationsplattform[144]
- Gedankenwerke, einige Tools und Anwendungen für kontinuierliche Lieferung und sofortige Nachrichten (Coyim)[145]
- Zucken, für ihr IRC-basiertes Chat-System (aus Python migriert)[146]
- Uberzum Umgang mit hohen Bänden von Geofence-basierte Abfragen[147]
Siehe auch verwandte Abfrage zu Wikidata.
Rezeption
Das Grenzflächensystem und das absichtliche Auslassen der Erbschaft wurden von Michele Simionato gelobt, der diese Eigenschaften mit denen von verglichen hat Standard ml, nennt es "eine Schande, dass keine populäre Sprache [dieser] bestimmten Route gefolgt ist".[148]
Dave Astels bei Motorhof schrieb im Jahr 2009:[149]
Go ist extrem einfach zu tauchen. Es gibt eine minimale Anzahl grundlegender Sprachkonzepte und die Syntax ist sauber und so konzipiert, klar und eindeutig zu sein. gehen ist immer noch experimentell und immer noch ein wenig rau an den Rändern.
Go wurde von der Programmiersprache des Jahres ausgezeichnet Tiobe Programming Community Index In seinem ersten Jahr 2009, für eine größere 12-monatige Beliebtheit (in nur 2 Monaten nach seiner Einführung im November) als jede andere Sprache in diesem Jahr und erreichte bis Januar 2010 den 13. Platz.[150] übertrieben etablierte Sprachen wie Pascal. Bis Juni 2015 war die Rangliste im Index auf unter den 50. gesunken und platzierte es niedriger als auf Cobol und Forran.[151] Im Januar 2017 war die Rangliste jedoch auf den 13. Platz gestiegen, was auf ein erhebliches Wachstum der Beliebtheit und der Annahme hinweist. Go wurde mit der Tiobe -Programmiersprache des Jahres 2016 ausgezeichnet.
Bruce Eckel hat angegeben:[152]
Die Komplexität von C ++ (Noch mehr Komplexität wurde im neuen C ++ hinzugefügt) und die daraus resultierenden Auswirkungen auf die Produktivität ist nicht mehr gerechtfertigt. Alle Reifen, die der C ++-Programmierer durchspringen musste, um eine C-kompatible Sprache zu verwenden, machen keinen Sinn mehr-sie sind nur Zeit und Mühe. Go macht viel sinnvoller für die Klasse von Problemen, die C ++ ursprünglich lösen sollte.
Eine Auswertung der Sprache 2011 und ihrer GC Implementierung im Vergleich zu C ++ (GCC), Java und Scala von einem Google -Ingenieur gefunden:
Go bietet interessante Sprachfunktionen, die auch eine prägnante und standardisierte Notation ermöglichen. Die Compiler für diese Sprache sind immer noch unreif, was sowohl in der Leistung als auch in den Binärgrößen widerspiegelt.
-R. Hundt[153]
Die Bewertung erhielt eine Widerlegung aus dem Go -Entwicklungsteam. Ian Lance Taylor, der den GO -Code für Hundts Papier verbessert hatte, war der Absicht, seinen Code zu veröffentlichen, nicht bekannt und sagte, dass seine Version "nie als Beispiel für idiomatisch oder effizientes GO" beabsichtigt hatte. Russ Cox optimierte dann den GO -Code sowie den C ++ - Code und erhielt den Go -Code, um etwas schneller als C ++ und mehr als eine Größenordnung schneller als der Code im Papier.[154]
Namensstreit
Am 10. November 2009, dem Tag der allgemeinen Veröffentlichung der Sprache, Francis McCabe, Entwickler der Gehen! Programmiersprache (Beachten Sie den Ausrufezeichen.[155] McCabe äußerte Bedenken, dass "der" Big Guy "über den Dampfdampf über ihn hinwegrollt", und diese Besorgnis stimmte mit den mehr als 120 Entwicklern, die zu Googles offiziellem Themen-Thread kommentierten[156] Sogar das Problem widerspricht Googles Motto von: Sei nicht böse.[157]
Am 12. Oktober 2010 wurde das Problem vom Google -Entwickler Russ Cox (@RSC) mit dem benutzerdefinierten Status "unglücklich" geschlossen, begleitet von dem folgenden Kommentar:
"Es gibt viele Computerprodukte und -dienste mit dem Namen Go. In den 11 Monaten seit unserer Veröffentlichung gab es nur minimale Verwirrung der beiden Sprachen."[157]
Kritik
Kritiker sagen das:
- Go's Null kombiniert mit dem Mangel an algebraische Typen führt zu Schwierigkeiten umzugehen und Fehler zu bewältigen und Basisfälle.[158][159]
- GO erlaubt nicht, dass eine Eröffnungsklammer in seiner eigenen Linie erscheint, was alle Go -Programmierer dazu zwingt, denselben Klammerstil zu verwenden.[160]
- Die Dateisemantik in der Go -Standardbibliothek basiert stark auf Posix Semantik, und sie karten nicht gut auf die Windows -Plattform.[161][162] Beachten Sie, dass dieses Problem nicht speziell ist, aber andere Programmiersprachen haben es durch gut definierte Standardbibliotheken gelöst.
- Eine Studie zeigte, dass es so einfach ist, Parallelitätsfehler mit der Nachricht zu machen wie mit gemeinsamem Speicher, manchmal sogar noch mehr.[163]
Siehe auch
Anmerkungen
- ^ Die Verwendung alternativer Backends reduziert die Kompilierungsgeschwindigkeit und die Kontrolle von GO über die Müllsammlung, bietet jedoch eine bessere Optimierung von Maschinencode.[18]
- ^ "Um komplexe Aussagen zu ermöglichen, eine einzelne Linie zu besetzen, kann ein Semikolon vor einem Schließen weggelassen werden) oder}".[51]
- ^ "Wenn die Newline nach einem Token kommt, das eine Aussage beenden könnte, fügt der Lexer ein Semikolon ein".[52]
- ^ Normalerweise hat genau einer der Ergebnisse und Fehlerwerte einen anderen Wert als den Nullwert des Typs. Manchmal tun beide, wie wenn ein Lese- oder Schreiben nur teilweise abgeschlossen sein kann, und manchmal auch nicht, wie wenn eine Lektüre 0 Bytes zurückgibt. Sehen Semipredicate -Problem: Mehrwertiger Rendite.
- ^ a b Sprache FAQ "Warum gibt es keine Zeigerarithmetik? Sicherheit ... leiten Sie niemals eine illegale Adresse ab, die falsch erfolgreich ist. Die Verwendung von Array -Indizes kann so effizient sein wie ... Zeigerarithmetik ... Vereinfachen Sie die Implementierung des Müllsammlers. .. "[11]
- ^ Sprachfaq "Warum haben keine Behauptungen? ... Unsere Erfahrung war, dass Programmierer sie als Krücke verwenden, um zu vermeiden, dass er über die richtige Fehlerbehandlung und -berichterstattung nachdenkt ..."[11]
- ^ FAQ Sprache "Warum gibt es keine unabgenannten Gewerkschaften ...? [Sie] würden die Speichersicherheitsgarantien von Go verstoßen."[11]
- ^ Sprach -FAQ "Warum haben sie keine Variantentypen? ... Wir haben uns [sie] berücksichtigt, aber sie überlappen sich auf verwirrende Weise mit Schnittstellen .... [s] oms, was die Adresse der Varianten bereits abgedeckt ist, ... obwohl nicht als elegant. "[11] (Das Tag eines Schnittstellentyps[101] wird mit einer Typbehauptung zugegriffen[102]).
- ^ Fragen "Wie erhalte ich dynamische Veröffentlichung von Methoden?" und "Warum gibt es keinen Typ Vererbung?" in der Sprache FAQ.[11]
Verweise
- ^ "Ist eine objektorientierte Sprache?". Abgerufen 13. April, 2019.
Obwohl GO Typen und Methoden hat und einen objektorientierten Programmstil ermöglicht, gibt es keine Typhierarchie.
- ^ "Go: Code, der mit Anmut wächst". Abgerufen 24. Juni, 2018.
Go ist objektorientiert, aber nicht auf die übliche Weise.
- ^ a b "Textdatei -Lizenz". Die Go -Programmiersprache. Abgerufen 5. Oktober, 2012.
- ^ https://go.dev/doc/devel/release#go1.19.
- ^ a b "Warum haben" implementiert "keine Erklärungen?". golang.org. Abgerufen 1. Oktober, 2015.
- ^ Pike, Rob (22. Dezember 2014). "Rob Pike auf Twitter". Abgerufen 13. März, 2016.
GO hat strukturelle Typisierung, keine Entenschreibung. Die vollständige Schnittstellenzufriedenheit wird überprüft und erforderlich.
- ^ "Lang/Go: Go-1.4-Go-Programmiersprache". OpenBSD -Ports. 23. Dezember 2014. Abgerufen 19. Januar, 2015.
- ^ "Porting Bemühungen gehen". Sprachressourcen gehen. Cat-V. 12. Januar 2010. Abgerufen 18. Januar, 2010.
- ^ "Zusätzliche IP -Rechte -Zuschüsse". Die Go -Programmiersprache. Abgerufen 5. Oktober, 2012.
- ^ Kincaid, Jason (10. November 2009). "Google's Go: Eine neue Programmiersprache, die Python C ++ trifft.". Techcrunch. Abgerufen 18. Januar, 2010.
- ^ a b c d e f g "Sprachdesign FAQ". golang.org. 16. Januar 2010. Abgerufen 27. Februar, 2010.
- ^ a b Metz, Cade (5. Mai 2011). "Google Go geht mutig dort, wo kein Code vorher gegangen ist". Das Register.
- ^ "Wird die Sprache Go oder Golang genannt?". Abgerufen 16. März, 2022.
Die Sprache heißt Go.
- ^ "GO 1.5 Versionsnotizen". Abgerufen 28. Januar, 2016.
Der Compiler und die Laufzeit sind jetzt in Go and Assembler ohne C implementiert.
- ^ "Go 1.11 wird veröffentlicht - The Go Blog". 24. August 2018. Abgerufen 1. Januar, 2019.
- ^ "Installieren von GCC: Konfiguration". Abgerufen 3. Dezember, 2011.
ADA, Go und Objective-C ++ sind keine Standardsprachen
- ^ "FAQ: Implementierung". golang.org. 2. August 2021. Abgerufen 2. August, 2021.
- ^ "Gollvm § Ist Gollvm ein Ersatz für den Haupt -Go -Compiler? (GC)". Git bei Google.
- ^ "Ein Compiler von Go zu JavaScript zum Ausführen von Go -Code in einem Browser: Gopherjs/Gopherjs". GitHub. 18. April 2020.
- ^ "Gehen Sie bei Google: Sprachdesign im Service von Software Engineering". Abgerufen 8. Oktober, 2018.
- ^ Pike, Rob (28. April 2010). "Noch ein Sprachdesign". Stanford EE Computer Systems Kolloquium. Universität in Stanford. Video verfügbar.
- ^ "Häufig gestellte Fragen (FAQ) - die Go -Programmiersprache". golang.org. Abgerufen 26. Februar, 2016.
- ^ Binstock, Andrew (18. Mai 2011). "Dr. Dobbs: Interview mit Ken Thompson". Archiviert von das Original am 5. Januar 2013. Abgerufen 7. Februar, 2014.
- ^ Pike, Rob (2012). "Weniger ist exponentiell mehr".
- ^ Griesemer, Robert (2015). "Die Entwicklung von Go".
- ^ Griesemer, Robert; Pike, Rob; Thompson, Ken; Taylor, Ian; Cox, Russ; Kim, Jini; Langley, Adam. "Hey! Ho! Lass uns gehen!". Google Open Source. Abgerufen 17. Mai, 2018.
- ^ Shankland, Stephen (30. März 2012). "Google's Go-Sprache wird eins, gewinnt einen Platz bei YouTube: Die Programmiersprache unter der unteren Ebene ist so gereift, die 1.0-Versionsnummer zu tragen. Und sie wird für echte Arbeit bei Google verwendet.". Nachrichten. CNET. CBS Interactive Inc. Abgerufen 6. August, 2017.
Google hat Version 1 seiner Go-Programmiersprache veröffentlicht, ein ehrgeiziger Versuch, die Riesen der Programmierwelt auf unterer Ebene wie C und C ++ zu verbessern.
- ^ "Veröffentlichungsgeschichte - die Go -Programmiersprache". golang.org.
- ^ "Go FAQ: Wird Google intern gehen?". Abgerufen 9. März, 2013.
- ^ "GO -Schriftarten - The Go Blog". Gehen. 16. November 2016. Abgerufen 12. März, 2019.
- ^ "GO FONT TTFS". GitHub. Abgerufen 2. April, 2019.
- ^ "Go's neue Marke". Der Go -Blog. Abgerufen 9. November, 2018.
- ^ Merrick, Alice (9. März 2021). "Go Developer Survey 2020 Ergebnisse". Gehen Sie Programmiersprache. Abgerufen 16. März, 2022.
- ^ a b Pike, Rob (26. September 2013). "Arrays, Scheiben (und Zeichenfolgen): Die Mechanik von 'Anhang' '". Der Go -Blog. Abgerufen 7. März, 2015.
- ^ "E2E: Erik Meijer und Robert Griesemer - Go Go". Kanal 9. Microsoft. 7. Mai 2012.
- ^ "Go 2 Draft Designs". Abgerufen 12. September, 2018.
- ^ "The Go Blog: Go 2 Draft Designs". 28. August 2018.
- ^ "Vorschlag: Eine integrierte GO-Fehlerprüfungsfunktion" Versuchen Sie "". Gehen Sie auf Github auf das Repository. Abgerufen 16. März, 2022.
- ^ "Typparameter - Entwurfsdesign". go.googlesource.com.
- ^ "Generika in Go". bitfieldConsulting.com.
- ^ "Go 1.18 wird veröffentlicht!". Gehen Sie Programmiersprache. 15. März 2022. Abgerufen 16. März, 2022.
- ^ "Go 1 und die Zukunft der Go -Programme - die Go -Programmiersprache". golang.org.
- ^ "Go 1.19 Versionshinweise - Die Go -Programmiersprache". Go.dev.
{{}}
: CS1 Wartung: URL-Status (Link) - ^ "Veröffentlichungsgeschichte - die Go -Programmiersprache". golang.org.
- ^ "Ein kurzer Leitfaden für Go's Assembler - die Go -Programmiersprache". Go.dev. Abgerufen 31. Dezember, 2021.
- ^ Pike, Rob. "Die Go -Programmiersprache". Youtube. Abgerufen 1. Juli, 2011.
- ^ Pike, Rob (10. November 2009). Die Go -Programmiersprache (FLV) (Technisches Gespräch). Google. Das Ereignis findet um 8:53 Uhr statt.
- ^ "Pakete und Abhängigkeiten herunterladen und installieren - Go - Die Go -Programmiersprache". Sehen godoc.org für Adressen und Dokumentation einiger Pakete.
- ^ "Godoc". godoc.org.
- ^ Pike, Rob. "Der Changelog" (Podcast).
- ^ "GO -Programmiersprache Spezifikation, §semicolons". golang.org.
- ^ "Wirksame Go, §semicolons". golang.org.
- ^ "Die GO -Programmiersprache Spezifikation - Die Go -Programmiersprache". golang.org.
- ^ Pike, Rob (23. Oktober 2013). "Saiten, Bytes, Runen und Charaktere in Go".
- ^ Doxsey, Caleb. "Strukturen und Schnittstellen - eine Einführung in das Programmieren in Go". www.golang-book.com. Abgerufen 15. Oktober, 2018.
- ^ Gerrand, Andrew. "Gehen Sie Scheiben: Nutzung und Interna".
- ^ Die Go -Autoren. "Effektiv Go: Scheiben".
- ^ Die Go -Autoren. "Selektoren - Die GO -Programmiersprachenspezifikation".
- ^ Die Go -Autoren. "Anrufe - Die Go -Programmiersprachspezifikation".
- ^ "GO -Programmiersprache Spezifikation, §Package unsicher". golang.org.
- ^ "Die GO -Programmiersprache Spezifikation - Die Go -Programmiersprache". Go.dev. Abgerufen 31. Dezember, 2021.
- ^ "Die GO -Programmiersprache Spezifikation". golang.org.
- ^ "Eine Tour durch Go". Go.dev.
- ^ "Die GO -Programmiersprache Spezifikation". golang.org.
- ^ "Die GO -Programmiersprache Spezifikation - Die Go -Programmiersprache". Go.dev. Abgerufen 31. Dezember, 2021.
- ^ "Die GO -Programmiersprache Spezifikation". golang.org.
- ^ a b Schmager, Frank; Cameron, Nicholas; Noble, James (2010). Gohotdraw: Bewertung der Go -Programmiersprache mit Entwurfsmustern. Bewertung und Benutzerfreundlichkeit von Programmiersprachen und Tools. ACM.
- ^ a b c d e Balbaert, Ivo (2012). Der Weg zu gehen: Eine gründliche Einführung in die Go -Programmiersprache. iuniverse.
- ^ "Die Entwicklung von Go". realks.golang.org. Abgerufen 13. März, 2016.
- ^ Diggins, Christopher (24. November 2009). "Enten -Typing und die Go -Programmiersprache". Dr. Dobbs, die Welt der Softwareentwicklung. Abgerufen 10. März, 2016.
{{}}
: CS1 Wartung: URL-Status (Link) - ^ Ryer, Mat (1. Dezember 2015). "Entenschreibung in Go". Abgerufen 10. März, 2016.
- ^ "Häufig gestellte Fragen (FAQ) - die Go -Programmiersprache". golang.org.
- ^ "Die GO -Programmiersprache Spezifikation". golang.org.
- ^ "Die GO -Programmiersprache Spezifikation". golang.org.
- ^ "Reflect Package - Reflect - pkg.go.dev". pkg.go.dev.
- ^ "Karte [String] Schnittstelle {} in Go". bitfieldConsulting.com.
- ^ "GO -Datenstrukturen: Schnittstellen". Abgerufen 15. November, 2012.
- ^ "Die GO -Programmiersprache Spezifikation". golang.org.
- ^ "Go 1.18 Versionshinweise: Generika". Gehen Sie Programmiersprache. 15. März 2022. Abgerufen 16. März, 2022.
- ^ "Ein Tutorial für die Go -Programmiersprache". Die Go -Programmiersprache. Abgerufen 10. März, 2013.
In Go ist die Regel über die Sichtbarkeit von Informationen einfach: Wenn ein Name (eines Typs, der Funktion, der Methode, der Konstanten oder eines Strukturfelds oder eines Strukturfelds oder einer Methode auf der Höhe des obersten Ebens) werden, können Benutzer des Pakets dies sehen. Ansonsten ist der Name und daher das so genannte Ding nur in dem Paket sichtbar, in dem er deklariert wird.
- ^ "Geh - die Go -Programmiersprache". golang.org.
- ^ "Wie schreibe ich Go -Code". golang.org.
Die Pakete aus der Standardbibliothek erhalten kurze Importpfade wie "fmt" und "net/http". Für Ihre eigenen Pakete müssen Sie einen Basispfad auswählen, der mit zukünftigen Ergänzungen in der Standardbibliothek oder anderen externen Bibliotheken wahrscheinlich nicht kollidiert wird. Wenn Sie Ihren Code irgendwo in einem Quell -Repository aufbewahren, sollten Sie das Root dieses Quell -Repositorys als Basispfad verwenden. Wenn Sie beispielsweise ein Beispielkonto unter Beispiel.com/user haben, sollte dies Ihr Basispfad sein
- ^ a b Pike, Rob (18. September 2012). "Parallelität ist keine Parallelität".
- ^ a b c d e Chisnall, David (2012). Das Go -Programmiersprachenphrassebook. Addison-Wesley. ISBN 9780132919005.
- ^ "Effektiv" ". golang.org.
- ^ Summerfield, Mark (2012). Programmierung in Go: Erstellen von Anwendungen für das 21. Jahrhundert. Addison-Wesley.
- ^ "Das Go -Speichermodell". Abgerufen 10. April, 2017.
- ^ "Gehen Sie Parallelitätsmuster". golang.org.
- ^ Graham-Cumming, John (24. August 2013). "Speicherpuffer in Go" Recycling ".
- ^ "Tree.go".
- ^ Cheslack-Postava, Ewen. "Iteratoren in Go".
- ^ Kernighan, Brian W. "Ein Abstieg in die Schwebe".
- ^ a b "Das Go -Speichermodell". Abgerufen 5. Januar, 2011.
- ^ Tang, Peiyi (2010). Multi-Core-Parallelprogrammierung in Go (PDF). Proc. Erste internationale Konferenz über Fortgeschrittene Computer und Kommunikation. Archiviert von das Original (PDF) am 9. September 2016. Abgerufen 14. Mai, 2015.
- ^ Nanz, Sebastian; West, Scott; Soares da Silveira, Kaue. Untersuchung der Expertenlücke in der parallele Programmierung (PDF). Euro-Par 2013. Citeseerx 10.1.1.368.6137.
- ^ Gehen Sie Autoren. "Gedächtnis teilen, indem Sie kommunizieren".
- ^ Cox, Russ. "Zu den Rennen".
- ^ Pike, Rob (25. Oktober 2012). "Gehen Sie bei Google: Sprachdesign im Service von Software Engineering". Google Inc. "Es gibt eine wichtige Einschränkung: GO ist in Gegenwart von Parallelität nicht rein ein reiner Gedächtnis."
- ^ "Häufig gestellte Fragen (FAQ) - die Go -Programmiersprache".
- ^ "Eine Geschichte eines Fetts wird binär". 21. September 2018.
- ^ "GO -Programmiersprache Spezifikation, §Interface -Typen". golang.org.
- ^ "GO -Programmiersprache Spezifikation, §typs Behauptungen". golang.org.
- ^ Alle Systeme sind Go. Informit. 17. August 2010. Abgerufen 21. Juni, 2018.
- ^ "Sprachdesign FAQ". 13. November 2009. archiviert von das Original am 13. November 2009.
- ^ "Vorschlag für einen außergewöhnlichen Mechanismus". Golang-Nüsse. 25. März 2010. Abgerufen 25.März, 2010.
- ^ "Wöchentliche Schnappschussgeschichte". golang.org.
- ^ "Panik und erholen sich". Geh Wiki.
- ^ "Effektiv" ". golang.org.
- ^ "gofmt - Die Go -Programmiersprache". golang.org. Abgerufen 5. Februar, 2021.
- ^ "Golang/Lint Public Archive". github.com.
- ^ a b "Effektiv" ". golang.org.
- ^ "Unbenutzte lokale Variablen". yourbasic.org. Abgerufen 11. Februar, 2021.
- ^ "Unbenutzte Paketimporte". yourbasic.org. Abgerufen 11. Februar, 2021.
- ^ "Code Review Kommentare". GitHub. Abgerufen 3. Juli, 2018.
- ^ "Gespräche". Abgerufen 3. Juli, 2018.
- ^ "Fehler sind Werte". Abgerufen 3. Juli, 2018.
- ^ "FMT - Die Go -Programmiersprache". golang.org. Abgerufen 8. April, 2019.
- ^ "Testen - Die Go -Programmiersprache". golang.org. Abgerufen 27. Dezember, 2020.
- ^ Avelino/Awesome-Go: Eine kuratierte Liste von Awesome Go-Frameworks, Bibliotheken und Software, abgerufen 10. Januar, 2018
- ^ "Edgex Foundry -Projekt". GitHub. Abgerufen 6. Februar, 2021.
- ^ "IPFS/Go-IPFS". GitHub. Abgerufen 1 Juni, 2018.
- ^ "LightningNetwork/lnd", GitHub, abgerufen 29. April, 2020
- ^ "NATS - Open Source Messaging System | Secure, native Cloud -Anwendungsentwicklung".
- ^ "Arctil - Websicherheitsinstrument Tool".
- ^ "Testgetriebene Entwicklung in Go | Cacoo". Kakoo. 29. Juli 2016. Abgerufen 1 Juni, 2018.
- ^ "Chango". GitHub.
- ^ Heller, Martin (17. Juli 2014). "Bewertung: Cloud Foundry bringt Strom und Politur in PaaS". JavaRld. Abgerufen 22. Januar, 2019.
- ^ Graham-Cumming, John (3. Juli 2012). "Gehen Sie bei Cloudflare".
- ^ Graham-Cumming, John (11. November 2013). "Was wir mit Go gemacht haben".
- ^ "Geh in Coreos". 25. November 2014.
- ^ "Couchbase". GitHub.
- ^ Lee, Patrick (7. Juli 2014). "Offene Beschaffung unserer Go -Bibliotheken".
- ^ "Offizielle GO -Umsetzung des Ethereum -Protokolls". GitHub. Äther. 18. April 2020.
- ^ "Warum wir Ruby on Rails verwenden, um Gitlab zu bauen". Gitlab. Abgerufen 6. Februar, 2021.
Ruby wurde für den Entwickler optimiert, nicht für das Ausführen in der Produktion ", sagt Sid. Schreiben Sie diejenigen in Go ... Wir versuchen immer noch, Gitlab weniger Speicher zu verwenden. Wir müssen also Multithreading aktivieren. Als wir Gitlab entwickelten, war das im Ruby on Rails -Ökosystem nicht üblich. Jetzt ist es häufiger, aber weil wir jetzt so viel Code und so viele Abhängigkeiten haben, wird es für uns ein längerer Weg sein, dorthin zu gelangen. Das sollte helfen; Es wird es nicht schnell schnell machen, aber zumindest wird es weniger Speicher verbrauchen
{{}}
: CS1 Wartung: URL-Status (Link) - ^ "dl.google.com: Powered by Go". golang.org.
- ^ Welsh, Matt (18. August 2013). "Umschreiben eines großen Produktionssystems in Go".
- ^ Symonds, David. "Hochleistungs -Apps auf Google App Engine".
- ^ "Mongo DB". GitHub. 18. April 2020.
- ^ "Das Netflix Tech -Blog: Anwendungsdaten -Caching mit SSDs". 25. Mai 2016.
- ^ "Golang/Go". GitHub. 18. April 2020.
- ^ Säcke, Steven. "Suche & Fortschritte". Plug.dj Tech Blog. Archiviert von das Original am 11. Juni 2015. Abgerufen 10. Juni, 2015.
- ^ Jenkins, Tim (6. März 2014). "Wie Sie Ihre Firma überzeugen, mit Golang zu gehen". SendGrids E -Mail -Lieferbarkeitsblog.
- ^ Bourgon, Peter. "Geh auf Soundcloud". Archiviert von das Original Am 11. November 2013.
- ^ "Gehen Sie zu Google I/O und Gopher Summerfest - The Go Blog". golang.org.
- ^ Twstrike (17. April 2020). "Coyim". Thoughtworks Streikteam.
- ^ Hiltner, Rhys (5. Juli 2016). "Go's March to Now-Latency GC".
- ^ "Wie wir die höchste Abfrage von Uber Engineering pro Sekunde pro Sekunde gebaut haben, mit Go". Uber Engineering Blog. 24. Februar 2016. Abgerufen 2. März, 2016.
- ^ Simionato, Michele (15. November 2009). "Schnittstellen gegen Erbschaft (oder achten Sie auf Go!)". Artima. Abgerufen 15. November, 2009.
- ^ Astels, Dave (9. November 2009). "Achtung, fertig, los!". Motoryard. Abgerufen 9. November, 2009.
- ^ JT (11. Januar 2010). "Google's Go gewinnt die Programmiersprache des Jahres" Auszeichnung ". Jaxenter. Abgerufen 5. Dezember, 2012.
- ^ "Tiobe Programming Community Index für Juni 2015". Tiobe -Software. Juni 2015. Abgerufen 5. Juli, 2015.
- ^ Eckel, Bruce (27. August 2011). "Rufen Sie von Python über JSON-RPC an". Abgerufen 29. August, 2011.
- ^ Hundt, Robert (2011). Schleifenerkennung in C ++/Java/Go/Scala (PDF). Scala -Tage.
- ^ Metz, Cade (1. Juli 2011). "Google Go trifft mit C ++ Bake-off zurück". Das Register.
- ^ Brownlee, John (13. November 2009). "Google nicht Google" Go ", bevor sie ihre Programmiersprache nannte.". Archiviert von das Original am 8. Dezember 2015. Abgerufen 26. Mai, 2016.
- ^ Claburn, Thomas (11. November 2009). "Google 'Go' name macht Anschuldigungen des Bösen '". Informationswoche. Archiviert von das Original am 22. Juli 2010. Abgerufen 18. Januar, 2010.
- ^ a b "Ausgabe 9 - Go - Ich habe den Namen für * My * Programmiersprache bereits verwendet.". Github. Google Inc. Abgerufen 12. Oktober, 2010.
- ^ Yager, Will. "Warum Go ist nicht gut". Abgerufen 4. November, 2018.
- ^ Dobronszki, Janos. "Alltägliche Probleme in Go". Abgerufen 4. November, 2018.
- ^ "Warum gibt es Zahnspangen, aber keine Semikolons? Und warum kann ich die Eröffnungsklammer nicht in die nächste Zeile setzen?". Abgerufen 26. März, 2020.
Die Vorteile eines einzelnen, programmatisch vorgeschriebenen Formats für alle GO -Programme überwiegen die wahrgenommenen Nachteile des jeweiligen Stils erheblich.
- ^ "Ich will Mr. Golangs wilde Fahrt". 28. Februar 2020. Abgerufen 17. November, 2020.
- ^ "Vorschlag: Betriebssystem: Create/Open/OpenFile () Setzen Sie file_share_delete unter Windows #32088". GitHub. 16. Mai 2019. Abgerufen 17. November, 2020.
- ^ Tu, Tengfei (2019). "Verständnis der realen Parallelitätsfehler in Go" (PDF).
Beispielsweise werden rund 58% der Blockierfehler durch das Bestehen von Nachrichten verursacht. Zusätzlich zu dem Verstoß gegen die Kanalnutzungsregeln von Go (z. B. Warten auf einem Kanal, den niemand an Daten sendet oder schließen), werden viele Genauigkeitsfehler durch die gemischte Verwendung von Nachrichtenübergeben und anderen neuen Semantik und neuen Bibliotheken in Go, die in GO, verursacht werden, verursacht. kann leicht übersehen werden, aber schwer zu erkennen
{{}}
: CS1 Wartung: URL-Status (Link)
Weitere Lektüre
- Donovan, Alan; Kernighan, Brian (Oktober 2015). Die Go -Programmiersprache (1. Aufl.). Addison-Wesley Professional. p. 400. ISBN 978-0-13-419044-0.
- Bodner, Jon (März 2021). Lernen gehen (1. Aufl.). O'Reilly. p. 352. ISBN 9781492077213.