<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://kryptowiki.eu/index.php?action=history&amp;feed=atom&amp;title=Go_%28Programmiersprache%29</id>
	<title>Go (Programmiersprache) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://kryptowiki.eu/index.php?action=history&amp;feed=atom&amp;title=Go_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://kryptowiki.eu/index.php?title=Go_(Programmiersprache)&amp;action=history"/>
	<updated>2026-10-05T11:18:29Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Kryptowiki - Die freie Enzyklopädie der Kryptowährungen</subtitle>
	<generator>MediaWiki 1.39.15</generator>
	<entry>
		<id>https://kryptowiki.eu/index.php?title=Go_(Programmiersprache)&amp;diff=2274&amp;oldid=prev</id>
		<title>C1ph4: Die Seite wurde neu angelegt: „{{Infobox Programmiersprache | Name = Go | Logo = Go-Logo 2018-04-26 | Beschreibung =  | Paradigma = […“</title>
		<link rel="alternate" type="text/html" href="https://kryptowiki.eu/index.php?title=Go_(Programmiersprache)&amp;diff=2274&amp;oldid=prev"/>
		<updated>2018-05-05T09:56:12Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „{{Infobox Programmiersprache | Name = Go | Logo = &lt;a href=&quot;/index.php?title=Datei:GoLanguage_Logo_2018-04-26_BlackWhite.svg&quot; title=&quot;Datei:GoLanguage Logo 2018-04-26 BlackWhite.svg&quot;&gt;300px|Go-Logo 2018-04-26&lt;/a&gt; | Beschreibung =  | Paradigma = […“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Programmiersprache&lt;br /&gt;
| Name = Go&lt;br /&gt;
| Logo = [[File:GoLanguage_Logo_2018-04-26_BlackWhite.svg|300px|Go-Logo 2018-04-26]]&lt;br /&gt;
| Beschreibung = &lt;br /&gt;
| Paradigma = [[Nebenläufigkeit|nebenläufig]], [[Imperative Programmierung|imperativ]], [[Strukturierte Programmierung|strukturiert]], [[Modulare Programmierung|modular]], [[Objektorientierte Programmierung|objektorientiert]]&lt;br /&gt;
| Erscheinungsjahr = 2009; erste stabile Version 2012&lt;br /&gt;
| Designer = &lt;br /&gt;
| Entwickler = [[Robert Griesemer]], [[Rob Pike]], [[Ken Thompson]] u.&amp;amp;nbsp;a.&lt;br /&gt;
| AktuelleVersion = 1.10&lt;br /&gt;
| AktuelleVersionFreigabeDatum = 16. Februar 2018&amp;lt;ref&amp;gt;[https://golang.org/doc/go1.10''Go 1.10 is released'']&amp;lt;/ref&amp;gt;&lt;br /&gt;
| AktuelleVorabVersion = &lt;br /&gt;
| AktuelleVorabVersionFreigabeDatum = &lt;br /&gt;
| Typisierung = [[Starke Typisierung|stark]], [[Statische Typisierung|statisch]]&lt;br /&gt;
| Implementierung = Gc, gccgo&lt;br /&gt;
| Dialekte = &lt;br /&gt;
| Standardisierungen = &lt;br /&gt;
| Beeinflusst_von = [[C (Programmiersprache)|C]], [[Newsqueak]], [[Alef (Programmiersprache)|Alef]], [[Limbo (Programmiersprache)|Limbo]], [[Oberon (Programmiersprache)|Oberon]]&lt;br /&gt;
| Beeinflusste = &lt;br /&gt;
| Betriebssystem = [[Linux]], [[macOS]], [[FreeBSD]], [[Microsoft Windows|Windows]], Experimentell: [[DragonFly BSD]], [[Plan 9 (Betriebssystem)|Plan 9]], [[Solaris (Betriebssystem)|Solaris]]&lt;br /&gt;
| Lizenz = [[BSD-Lizenz]]&lt;br /&gt;
| Website = [https://golang.org/ golang.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Go''' ist eine [[Kompilierung|kompilierbare]] [[Programmiersprache]], die [[Nebenläufigkeit]] unterstützt und über eine [[Garbage Collection|automatische Speicherbereinigung]] verfügt. Entwickelt wurde Go von Mitarbeitern des Unternehmens [[Google Inc.]]&amp;lt;ref&amp;gt;[http://www.techcrunch.com/2009/11/10/google-go-language/ Google-go-language]&amp;lt;/ref&amp;gt; Die Entwürfe stammen von [[Robert Griesemer]], [[Rob Pike]] und [[Ken Thompson]].&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
Go wurde aus Unzufriedenheit über die bestehenden Sprachen zur Softwareentwicklung wie [[C++]] oder [[Java (Programmiersprache)|Java]] im Kontext heutiger Computersysteme, insbesondere im Hinblick auf [[Skalierbarkeit|skalierbare]] [[Netzwerkdienst]]e, [[Rechnerverbund|Cluster]]- und [[Cloud Computing]], entwickelt.&amp;lt;ref&amp;gt;[https://www.youtube.com/watch?v=FTl0tl9BGdc Why Learn Go?] – Kurzinterview mit Rob Pike (Video, englisch)&amp;lt;/ref&amp;gt; Im Vergleich zu C++ hat Go weit weniger Keywords. Eines der Probleme, das Go lösen möchte, ist die Compiler-Ineffizienz in C und C++. Wichtige Ziele bei der Entwicklung waren unter anderem die Unterstützung von Nebenläufigkeit mit nativen Sprachelementen und die Erleichterung der Softwareentwicklung mit großen Entwicklerteams und großen Codebasen.&amp;lt;ref&amp;gt;[http://talks.golang.org/2012/splash.article talks.golang.org]&amp;lt;/ref&amp;gt; Go besitzt einen eigenen Garbage Collector, erlaubt die Verwendung von [[Zeiger (Informatik)|Zeigern]], verzichtet jedoch auf Zeigerarithmetik.&amp;lt;ref&amp;gt;[https://golang.org/doc/faq#no_pointer_arithmetic golang.org]&amp;lt;/ref&amp;gt; Go ist eine kompilierte Sprache, bei der Wert auf eine hohe Übersetzungsgeschwindigkeit gelegt wurde.&lt;br /&gt;
&lt;br /&gt;
Go orientiert sich syntaktisch an der Programmiersprache [[C (Programmiersprache)|C]] mit einigem Einfluss aus der [[Niklaus Wirth|Wirthschen]] Sprachfamilie ([[Pascal (Programmiersprache)|Pascal]], [[Modula-2|Modula]] und insbesondere [[Oberon (Programmiersprache)|Oberon]]). Die Unterstützung für Nebenläufigkeit wurde nach Vorbild der von [[Tony Hoare]] eingeführten [[Communicating Sequential Processes]] (CSP) gestaltet und steht in Tradition der Programmiersprachen [[Newsqueak]], [[Alef (Programmiersprache)|Alef]] und [[Limbo (Programmiersprache)|Limbo]].&amp;lt;ref&amp;gt;[https://www.youtube.com/watch?v=3DtUzH3zoFo Origins of Go’s Concurrency Model]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Merkmale und Sprachmittel ==&lt;br /&gt;
Go bietet [[Closure (Funktion)|Closures]] und [[Reflexion (Programmierung)|Reflexion]]&amp;lt;ref&amp;gt;[http://www.golem.de/0911/71113.html Golem.de-Artikel ''Go - schnelle Programmiersprache von Google'']&amp;lt;/ref&amp;gt; sowie [[Typsicherheit]] und eine automatische Speicherbereinigung.&lt;br /&gt;
[[Objektorientierte Programmierung|Objektorientierung]] unterstützt Go durch [[Schnittstelle (Objektorientierung)|Interfaces]] und [[Mixin]]s. Auf [[Klasse (Objektorientierung)|Klassen]] wird bewusst verzichtet. Außerdem ist es möglich, den Quellcode wie bei [[Java (Programmiersprache)|Java]] durch Pakete zu modularisieren.&lt;br /&gt;
Nebenläufigkeit wird durch [[Communicating Sequential Processes]] realisiert, die ''Goroutinen'' genannt werden und über Kanäle ''(Channels)'' miteinander kommunizieren können. [[Generischer Typ|Generische Typen]] gibt es nicht, eine spätere Integration ist aber nicht ausgeschlossen.&amp;lt;ref&amp;gt;[https://golang.org/doc/faq#generics golang.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
Unicode wird in Form von [[UTF-8]] unterstützt, sowohl für Strings als auch für Variablenbezeichner im Quelltext (allerdings nur Unicode-Buchstaben und -Ziffern), „Δt = t1 - t2“ ist also möglich.&amp;lt;ref&amp;gt;[https://golang.org/doc/faq#unicode_identifiers golang.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
Die Syntax von Go orientiert sich im Wesentlichen an der Syntax der Programmiersprache [[C (Programmiersprache)|C]], weicht davon aber an einigen Stellen ab. So kann beispielsweise auf den Abschluss von [[Anweisung (Programmierung)|Anweisungen]] durch ein Semikolon verzichtet werden. Datentypen werden bei [[Deklaration (Programmierung)|Deklarationen]] hinter den Bezeichner geschrieben statt davor, um die Deklaration von Funktionstypen zu vereinfachen.&amp;lt;ref&amp;gt;[http://blog.golang.org/2010/07/gos-declaration-syntax.html blog.golang.org]&amp;lt;/ref&amp;gt; Code-Blöcke werden mit geschweiften Klammern abgegrenzt. Neben dem einfachen Gleichheitszeichen als Zuweisungsoperator gibt es zusätzlich den Operator &amp;lt;code&amp;gt;:=&amp;lt;/code&amp;gt;, der Deklaration mit [[Typinferenz]] und Zuweisung kombiniert. Die Sprache umfasst mit 25 [[Schlüsselwort (Programmierung)|Schlüsselwörtern]] weniger Schlüsselwörter als [[Varianten der Programmiersprache C|ANSI C]].&lt;br /&gt;
&lt;br /&gt;
Kommentare werden wie in C oder C++ mit Schrägstrichen markiert; &amp;lt;code&amp;gt;/*&amp;lt;/code&amp;gt; bis &amp;lt;code&amp;gt;*/&amp;lt;/code&amp;gt; bezeichnet einen [[Kommentar (Programmierung)|Kommentarbereich]], der auch mehrere Zeilen beinhalten kann, &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt; leitet einen Kommentarbereich bis zum Ende der Zeile ein.&lt;br /&gt;
&lt;br /&gt;
Jede Quelldatei gehört genau einem Paket an, das am Anfang der Datei mit der &amp;lt;code&amp;gt;package&amp;lt;/code&amp;gt;-Anweisung angegeben wird.&lt;br /&gt;
&lt;br /&gt;
Das Schlüsselwort für Funktionen lautet &amp;lt;code&amp;gt;func&amp;lt;/code&amp;gt;, die Funktion &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt; in dem „main“-Paket ist der Startpunkt des Go-Programms.&lt;br /&gt;
&lt;br /&gt;
Jede Variable hat einen definierten Typ.&lt;br /&gt;
&lt;br /&gt;
== Einfache Beispiele ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
package main&lt;br /&gt;
&lt;br /&gt;
import &amp;quot;fmt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func main() {&lt;br /&gt;
    fmt.Println(&amp;quot;Hallo Welt&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der obige Quelltext gibt am Ausgabemedium den String &amp;lt;code&amp;gt;Hallo Welt&amp;lt;/code&amp;gt; aus.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel berechnet die [[Kreiszahl]] Pi näherungsweise über die [[Leibniz-Reihe]].&lt;br /&gt;
Für die Berechnung werden parallele Go-Routinen und ein Kanal verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
package main&lt;br /&gt;
&lt;br /&gt;
import (&lt;br /&gt;
    &amp;quot;fmt&amp;quot;&lt;br /&gt;
    &amp;quot;math&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
func main() {&lt;br /&gt;
    fmt.Println(calcpi(5000))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// calcpi startet n Goroutinen, um eine&lt;br /&gt;
// Näherung von Pi zu berechnen.&lt;br /&gt;
func calcpi(n int) float64 {&lt;br /&gt;
    ch := make(chan float64)&lt;br /&gt;
    for k := 0; k &amp;lt; n; k++ {&lt;br /&gt;
        // alle n Werte parallel berechnen&lt;br /&gt;
        go term(ch, float64(k))&lt;br /&gt;
    }&lt;br /&gt;
    // das Ergebnis mit Null initialisieren&lt;br /&gt;
    f := float64(0.0)&lt;br /&gt;
    for k := 0; k &amp;lt; n; k++ {&lt;br /&gt;
        // alle n Werte addieren&lt;br /&gt;
        f += &amp;lt;-ch&lt;br /&gt;
    }&lt;br /&gt;
    return f&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func term(ch chan&amp;lt;- float64, k float64) {&lt;br /&gt;
    ch &amp;lt;- 4 * math.Pow(-1, k) / (2*k + 1)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die einzelnen [[Summand]]en der [[Reihe (Mathematik)|mathematischen Reihe]] werden parallel ausgeführt und schreiben ihre Ergebnisse jeweils in den Kanal &amp;lt;code&amp;gt;ch&amp;lt;/code&amp;gt;. Gleichzeitig werden die Werte aus dem Kanal zu einem Gesamtergebnis addiert. Am Ausgabegerät erscheint die Ziffernfolge &amp;lt;code&amp;gt;3.1417926135957934&amp;lt;/code&amp;gt;. Die Abweichung zur eigentlichen Kreiszahl ab der vierten Nachkommastelle ist vor allem auf die langsame Konvergenz der [[Leibniz-Reihe]] zurückzuführen.&lt;br /&gt;
&lt;br /&gt;
== Objektorientierung ==&lt;br /&gt;
Go unterstützt objektorientierte Programmierung, diese ist jedoch nicht [[Klasse (Objektorientierung)|klassenbasiert]]. Datentypen können in Go [[Methode (Programmierung)|Methoden]] besitzen. [[Polymorphie (Programmierung)|Polymorphie]] wird über ''Interfaces'' ([[Schnittstelle]]n) erreicht, über die Methodenaufrufe zur Laufzeit an die konkrete Implementierung gebunden werden ([[Dynamische Bindung]]). Für einen Datentyp muss nicht explizit deklariert werden, dass er ein bestimmtes Interface erfüllt. Diese Beziehung wird stattdessen implizit beim Kompilieren ermittelt, um lose [[Kopplung (Softwareentwicklung)|Kopplung]] zu erreichen.&lt;br /&gt;
&lt;br /&gt;
Statt [[Vererbung (Programmierung)|Vererbung]] und Typ-Hierarchien kommt in Go Komposition zum Einsatz. Hierfür unterstützt Go eine Form von Mixins, die in Go ''embedding'' („Einbettung“) genannt wird: eine Datenstruktur kann beliebig viele andere Datentypen einbetten, so dass sie deren Methoden und Datenfelder erhält.&lt;br /&gt;
&lt;br /&gt;
Beispiel zu Typen, Interfaces und Mixins:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
package main&lt;br /&gt;
&lt;br /&gt;
import &amp;quot;fmt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Definieren zweier Typen&lt;br /&gt;
type User struct {&lt;br /&gt;
	Name string&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
type Admin struct {&lt;br /&gt;
	User // Admin bettet zudem den Typen 'User' ein&lt;br /&gt;
	Email string&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Ein Interface mit der Methode 'Notify()'&lt;br /&gt;
type Notifier interface {&lt;br /&gt;
	Notify()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// User und Admin implementieren das Interface 'Notifier'&lt;br /&gt;
// Eine vorherige Deklaration zur Implementierung ist nicht notwendig&lt;br /&gt;
func (u User) Notify() {&lt;br /&gt;
	fmt.Printf(&amp;quot;User : Sending User Email To %s\n&amp;quot;,&lt;br /&gt;
		u.Name)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func (a Admin) Notify() {&lt;br /&gt;
	fmt.Printf(&amp;quot;Admin: Sending Admin Email To %s. His adress is \&amp;quot;%s\&amp;quot;.\n&amp;quot;,&lt;br /&gt;
		a.Name, // Verwenden des eingebetteten Feldes 'Name' vom User&lt;br /&gt;
		a.Email)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func main() {&lt;br /&gt;
	// Einen User und einen Admin erstellen&lt;br /&gt;
	user := User{&lt;br /&gt;
		Name: &amp;quot;john smith&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	admin := Admin{&lt;br /&gt;
		User:  user,&lt;br /&gt;
		Email: &amp;quot;john@email.com&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Die implementierte Notify-Methode aufrufen&lt;br /&gt;
	// Mittels dynamischer Bindung wird die Methode am richtigen Typen aufgerufen&lt;br /&gt;
	user.Notify()&lt;br /&gt;
	admin.Notify()&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nebenläufigkeit ==&lt;br /&gt;
Zur Unterstützung der nebenläufigen Programmierung in Go wird das Konzept der Kanäle ''(channels)'' genutzt, das eine relativ stark abstrahierte Möglichkeit der synchronen oder asynchronen Kommunikation zwischen Go-Routinen bietet. Ein Kanal ist dabei ein Speicherbereich, der durch Semaphore abgesichert ist und eine Warteschlange (buffered/asynchronous channel) oder lediglich eine Schnittstelle (unbuffered/synchronous channel) zur Verfügung stellt.&amp;lt;ref&amp;gt;[https://golang.org/doc/effective_go.html#channels golang.org]&amp;lt;/ref&amp;gt; Über einen Kanal lassen sich dabei nur Daten eines festen Typs übertragen. Hierbei ist jedoch keinerlei Begrenzung hinsichtlich des Typs gegeben, auch Channels für Channels sind denkbar.&amp;lt;ref&amp;gt;[https://golang.org/doc/effective_go.html#chan_of_chan golang.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Kanal wird durch den Aufruf &amp;lt;code&amp;gt;make(chan typ)&amp;lt;/code&amp;gt; (synchron) bzw. &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;make(chan typ, größe)&amp;lt;/code&amp;gt; (asynchron, wenn ''größe'' &amp;gt; 0) erstellt. Anschließend können Go-Routinen in den Channel schreiben, von ihm lesen und ihn schließen.&lt;br /&gt;
&lt;br /&gt;
Bei synchronen Kanälen blockiert ein Lesezugriff, bis eine andere Go-Routine in den Channel schreibt, bzw. der Schreibzugriff, bis eine andere Routine liest.&lt;br /&gt;
Bei asynchronen Kanälen tritt ein solches Verhalten nur auf, wenn der zu lesende Channel leer bzw. der zu schreibende Channel voll ist.&lt;br /&gt;
Es gibt in Go keine Beschränkung hinsichtlich der Anzahl an Go-Routinen, die einen Channel lesen und schreiben.&lt;br /&gt;
Trotz der ausgefeilten Synchronisationsmechanismen kann bei der Benutzung von Channels ein Deadlock auftreten, welcher die Go-Laufzeitumgebung veranlasst, das Programm zu beenden.&lt;br /&gt;
Eine Go-Routine kann über das &amp;lt;code&amp;gt;select&amp;lt;/code&amp;gt; Konstrukt auf mehreren Channels gleichzeitig lauschen, bzw. versuchen, in mehrere Channels zu schreiben, wobei dasjenige &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt;-Statement ausgeführt wird, welches zuerst nicht mehr blockiert.&lt;br /&gt;
&lt;br /&gt;
Daten werden mit &amp;lt;code&amp;gt;kanal &amp;lt;- Wert&amp;lt;/code&amp;gt; in einen Kanal geschrieben und mit &amp;lt;code style=&amp;quot;white-space: nowrap&amp;quot;&amp;gt;variable = &amp;lt;-kanal&amp;lt;/code&amp;gt; gelesen, wobei beim Lesen die Variablenzuweisung wegfallen kann. Das Lauschen auf einem Channel kann auch mit dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Konstrukt automatisiert werden, wobei die Schleife verlassen wird, sobald der Channel geschlossen wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
package main&lt;br /&gt;
&lt;br /&gt;
import &amp;quot;fmt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func zehnMal(kanal chan string) {&lt;br /&gt;
    // Argument empfangen&lt;br /&gt;
    sag := &amp;lt;-kanal&lt;br /&gt;
&lt;br /&gt;
    // Zehnmal zurückschreiben&lt;br /&gt;
    for i := 0; i &amp;lt; 10; i++ {&lt;br /&gt;
        kanal &amp;lt;- sag&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Kanal schließen&lt;br /&gt;
    close(kanal)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func main() {&lt;br /&gt;
    // synchronen Kanal öffnen&lt;br /&gt;
    kanal := make(chan string) // oder make(chan string, 0)&lt;br /&gt;
&lt;br /&gt;
    // Starten der parallelen Go-Routine „zehnMal()“&lt;br /&gt;
    go zehnMal(kanal)&lt;br /&gt;
&lt;br /&gt;
    // Senden eines Strings&lt;br /&gt;
    kanal &amp;lt;- &amp;quot;Hallo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    // Empfangen der Strings, bis der Channel geschlossen wird&lt;br /&gt;
    for s := range kanal {&lt;br /&gt;
        fmt.Println(s)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    fmt.Println(&amp;quot;Fertig!&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; die Go-Routine &amp;lt;code&amp;gt;zehnMal()&amp;lt;/code&amp;gt; auf, die einen empfangenen String zehnmal über den gleichen Kanal zurückgibt und ihn danach schließt. Durch den synchronen Kanal warten die beiden Go-Routinen aufeinander, sodass &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; erst in die &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-Schleife eintritt, wenn &amp;lt;code&amp;gt;zehnMal()&amp;lt;/code&amp;gt; den String empfangen hat. Wäre der Kanal nicht synchron, könnte ein Deadlock auftreten, wenn main() die geschriebene Variable sofort wieder liest (und aus dem Puffer entfernt) und &amp;lt;code&amp;gt;zehnMal()&amp;lt;/code&amp;gt; vergeblich auf sein Argument wartet. Wichtig ist auch, dass &amp;lt;code&amp;gt;zehnMal()&amp;lt;/code&amp;gt; nach dem Schreiben der Strings den Kanal schließt, da &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; sonst die Schleife nicht verlassen kann.&lt;br /&gt;
&lt;br /&gt;
== Implementierungen ==&lt;br /&gt;
Es gibt mindestens zwei [[Compiler]] für Go, die auf [[Linux]], [[macOS]], [[Microsoft Windows|Windows]] und [[FreeBSD]] betrieben werden können und die Go&amp;amp;nbsp;1 Spezifikation vollständig implementieren:&lt;br /&gt;
; Gc&lt;br /&gt;
: ist der offizielle Go-Compiler und wurde initial von Ken Thompson in C geschrieben, basierte auf der [[Plan 9 (Betriebssystem)|Plan&amp;amp;nbsp;9]] [[Toolchain]] und nutzte [[Yacc]]/[[GNU Bison|Bison]] zum [[Parser|Parsen]]. Mit Version 1.5 wurde dieser Compiler von C nach Go übersetzt und ist damit ''self-hosting''. Ursprünglich bestand der Compiler aus mehreren ausführbaren Kommandos, die unterschiedliche Namen je nach Ziel-Architektur hatten: 8g für [[x86]], 6g für [[AMD64|x86_64]], 5g für [[ARM-Architektur|ARM]]. Mit Version 1.5 wurden diese zu einem einzelnen ausführbaren Kommando zusammengefasst (''go tool compile''), und die Ziel-Architektur kann über die Umgebungsvariable ''GOARCH'' gewählt werden.&lt;br /&gt;
; Gccgo&lt;br /&gt;
: von Ian Taylor ist ein Go-[[Front-End und Back-End|Frontend]] für die [[GNU Compiler Collection]] (GCC). Das in [[C++]] geschriebene Frontend nutzt zum Parsen einen [[Rekursiver Abstieg|rekursiven Abstieg]]. Die folgenden Backend-Schritte sind die der Standard-GCC-Verarbeitung&amp;lt;ref&amp;gt;[https://golang.org/doc/faq#Implementation golang.org/doc/faq#Implementation]&amp;lt;/ref&amp;gt;. Durch dieses Vorgehen wird zwar die [[Kompilierzeit]] im Vergleich zum Gc-Compiler erhöht, jedoch ist der produzierte Code effizienter. Die GNU Compiler Collection (GCC) unterstützt Go 1 mit Version 4.7.1 vollständig,&amp;lt;ref&amp;gt;[http://gcc.gnu.org/gcc-4.7/changes.html GCC 4.7 Release Series Changes, New Features, and Fixes]&amp;lt;/ref&amp;gt; der [[GNU Debugger]] (gdb) unterstützt Go ab Version 7.5.&amp;lt;ref&amp;gt;[http://sourceware.org/ml/gdb-announce/2012/msg00004.html GDB 7.5 Release Notes]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beide Compiler implementieren eine parallele [[Automatische Speicherbereinigung#Mark-and-Sweep-Algorithmus|Mark-and-Sweep-Speicherbereinigung]].&lt;br /&gt;
&lt;br /&gt;
Der offizielle Compiler wird von dem [[Kommandozeile]]n-Werkzeug ''go'' begleitet, das als Fassade für verschiedene Werkzeuge dient, wie z.&amp;amp;nbsp;B. dem Installieren von Paketen aus Quelltext-[[Repository|Repositories]] im Internet wie etwa [[GitHub]] oder [[Google Code]] ''(go get)'', dem automatischen Formatieren von Quelltext ''(go fmt)'', dem Ausführen von [[Modultest|Tests]] ''(go test)'', dem Erzeugen von Dokumentation aus Quelltext-Kommentaren ''(go doc)'' oder dem Kompilieren des Projektes ''(go build)'', so dass keinerlei [[Make]]files nötig sind, wenn eine empfohlene Verzeichnisstruktur eingehalten wird.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Die Entwurfsphase begann am 21.&amp;amp;nbsp;September 2007, anfangs als 20-Prozent-Projekt auf Initiative von Robert Griesemer, Rob Pike und Ken Thompson. Bald darauf stießen weitere Entwickler dazu, und Go wurde zum Vollzeit-Projekt.&amp;lt;ref&amp;gt;[https://golang.org/doc/faq Informationen zur Geschichte in offizieller FAQ]&amp;lt;/ref&amp;gt; Am 30.&amp;amp;nbsp;Oktober 2009 wurde Go von Rob Pike in einem Google TechTalk präsentiert und die Veröffentlichung als [[freie Software]] angekündigt, die dann wie angekündigt am 10.&amp;amp;nbsp;November erfolgte.&amp;lt;ref&amp;gt;[http://google-opensource.blogspot.de/2009/11/hey-ho-lets-go.html ursprüngliche Nachricht über die Veröffentlichung im Google Open Source Blog]&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://www.heise.de/ix/meldung/Go-Googles-Programmiersprache-fuer-Abenteuerlustige-855912.html iX-Artikel vom 11.&amp;amp;nbsp;November 2009]&amp;lt;/ref&amp;gt; Seitdem sind zahlreiche Beiträge von Entwicklern aus der Go-Community außerhalb Googles hinzugekommen. Am 28. März 2012 wurde Version 1 freigegeben.&amp;lt;ref&amp;gt;[http://blog.golang.org/2012/03/go-version-1-is-released.html Freigabe der Version 1 im ''Go Programming Language Blog'']&amp;lt;/ref&amp;gt; Seitdem gelten Sprachspezifikation und Standardbibliothek als stabil und sollen innerhalb der 1.x-Serie auf Quelltext-Ebene abwärtskompatibel bleiben.&amp;lt;ref&amp;gt;[https://golang.org/doc/go1compat.html golang.org]&amp;lt;/ref&amp;gt; Am 14. Mai 2013 wurde Go 1.1 freigegeben, das vor allem [[Rechenleistung|Performance]]-Verbesserungen an der Implementierung enthält.&amp;lt;ref&amp;gt;[http://blog.golang.org/2013/05/go-11-is-released.html blog.golang.org]&amp;lt;/ref&amp;gt; Jeweils sechs Monate später erschienen die Versionen Go 1.2 bis Go 1.10.&lt;br /&gt;
&lt;br /&gt;
Vom 24. bis zum 26. April 2014 fand die erste Konferenz zu Go, die GopherCon,&amp;lt;ref&amp;gt;[http://gophercon.com/ GopherCon]&amp;lt;/ref&amp;gt; in [[Denver]] statt, welche seitdem jährlich stattfindet.&lt;br /&gt;
&lt;br /&gt;
== Maskottchen ==&lt;br /&gt;
[[File:The Go Gopher.jpg|thumb|Das Gopher-Maskottchen von Go|300x300px]]&lt;br /&gt;
Das Go-Maskottchen ist eine [[Taschenratte]] (englisch ''Gopher''). Es wurde von Renée French entworfen, die auch Glenda, das [[Plan 9 (Betriebssystem)|Plan-9]]-Häschen entworfen hat. Das Logo und das Maskottchen stehen unter der [[Creative Commons]] Attribution 3.0 Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
*  {{Literatur&lt;br /&gt;
   |Autor=Alan A. A. Donovan, Brian W. Kernighan&lt;br /&gt;
   |Titel=The Go Programming Language&lt;br /&gt;
   |Verlag=Pearson Education&lt;br /&gt;
   |Jahr=2015&lt;br /&gt;
   |ISBN=978-0-13-419044-0}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Frank Müller&lt;br /&gt;
   |Titel=Systemprogrammierung in Google Go: Grundlagen, Skalierbarkeit, Performanz, Sicherheit&lt;br /&gt;
   |Verlag=dpunkt.verlag&lt;br /&gt;
   |Ort=Heidelberg&lt;br /&gt;
   |Jahr=2011&lt;br /&gt;
   |ISBN=978-3-89864-712-0}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Rainer Feike&lt;br /&gt;
   |Titel=Programmierung in Google Go: Neuigkeiten von Google in der Systemprogrammierung&lt;br /&gt;
   |Verlag=Addison-Wesley&lt;br /&gt;
   |Ort=München/Boston&lt;br /&gt;
   |Jahr=2010&lt;br /&gt;
   |ISBN=978-3-8273-3009-3}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Caleb Doxsey&lt;br /&gt;
   |Titel=[http://www.golang-book.com/ An Introduction to Programming in Go]&lt;br /&gt;
   |Jahr=2012&lt;br /&gt;
   |ISBN=978-1-4783-5582-3}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://golang.org/ Offizielle Website] (englisch)&lt;br /&gt;
** [https://golang.org/ref/spec Spezifikation] (englisch)&lt;br /&gt;
** [https://tour.golang.org/ Eine interaktive Einführungs-Tour] (englisch)&lt;br /&gt;
* Übersetzungen (deutsch)&lt;br /&gt;
** [http://go-tour-de1.appspot.com/ Eine Tour durch Go]&lt;br /&gt;
** [http://www.bitloeffel.de/DOC/golang/go_spec_de.html Sprachbeschreibung usw.]&lt;br /&gt;
* [https://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Software Engineering] – Artikel von Rob Pike über das Sprachdesign (englisch)&lt;br /&gt;
* [https://www.youtube.com/watch?v=rKnDgT73v8s Vortrag von Rob Pike] vom 30.&amp;amp;nbsp;Oktober 2009 ([http://talks.golang.org/2009/go_talk-20091030.pdf Präsentationsfolien] (PDF; 242&amp;amp;nbsp;kB))&lt;br /&gt;
* [http://go-lang.cat-v.org/ Go Language Resources] (englisch)&lt;br /&gt;
* [http://www.admin-magazin.de/Das-Heft/2012/04/Programmieren-mit-Go Programmieren mit Go] (ADMIN-Magazin)&lt;br /&gt;
* [http://helmbold.de/artikel/pro-contra-go Pro und contra Go] (deutsch)&lt;br /&gt;
* [https://gobyexample.com/ Go by example] (englisch)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Navigationsleiste Google-Produkte}}&lt;br /&gt;
{{Normdaten|TYP=s|GND=7725033-3}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprache]]&lt;br /&gt;
[[Kategorie:Google]]&lt;br /&gt;
[[Kategorie:Freies Programmierwerkzeug]]&lt;/div&gt;</summary>
		<author><name>C1ph4</name></author>
	</entry>
</feed>