<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/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://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Go_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Go_(Programmiersprache)&amp;action=history"/>
	<updated>2026-05-27T06:18:10Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Go_(Programmiersprache)&amp;diff=1805404&amp;oldid=prev</id>
		<title>imported&gt;Baumfreund-FFM: übliche Formatierung</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Go_(Programmiersprache)&amp;diff=1805404&amp;oldid=prev"/>
		<updated>2026-01-18T15:02:25Z</updated>

		<summary type="html">&lt;p&gt;übliche Formatierung&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                         = [[Datei:Go Logo Blue.svg|250px|Go-Logo, 26. April 2018]]&lt;br /&gt;
| Beschreibung                 = &lt;br /&gt;
| Paradigma                    = [[Nebenläufigkeit|nebenläufig]], [[Imperative Programmierung|imperativ]], [[Strukturierte Programmierung|strukturiert]], [[Modulare Programmierung|modular]], [[Objektorientierte Programmierung|objektorientiert]], [[Generische Programmierung|generisch]]&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              = &amp;lt;!-- Wikidata --&amp;gt;&lt;br /&gt;
| AktuelleVersionFreigabeDatum = &amp;lt;!-- Wikidata --&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]], [[Google Fuchsia|Fuchsia]], Experimentell: [[DragonFly BSD]], [[Plan 9 (Betriebssystem)|Plan 9]], [[Solaris (Betriebssystem)|Solaris]], [[z/OS]]&lt;br /&gt;
| Lizenz                       = &lt;br /&gt;
| Website                      = [https://go.dev/ go.dev]&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Go&amp;#039;&amp;#039;&amp;#039; (auch &amp;#039;&amp;#039;&amp;#039;Golang&amp;#039;&amp;#039;&amp;#039;) ist eine [[Kompilierung|kompilierbare]] [[Programmiersprache]], die [[Nebenläufigkeit]] und [[Garbage Collection|automatische Speicherbereinigung]] unterstützt. 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 von Google entwickelt, um Problemen, die C, C++, Java und Co. mit sich brachten, zu begegnen. Insbesondere Probleme im Hinblick auf [[Skalierbarkeit|skalierbare]] [[Netzwerkdienst]]e, [[Rechnerverbund|Cluster]]- und [[Cloud Computing]] haben das Team dazu geführt, Go zu entwickeln.&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; Vor allem hat Go viel weniger [[Schlüsselwort (Programmierung)|Schlüsselwörter]] als die Sprachen aus der C-Familie. Zudem sollte Go eins lösen: die Compiler-Ineffizienz in der C-Familie. 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 [[Codebasis|Codebasen]].&amp;lt;ref&amp;gt;[https://go.dev/talks/2012/splash.article Go at Google: Language Design in the Service of Software Engineering]&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://go.dev/doc/faq#no_pointer_arithmetic go.dev – FAQ-Eintrag zu Zeigerarithmetik]&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;{{Internetquelle |autor=Jens Ihlenfeld | werk=[[Golem.de]] |url=https://www.golem.de/0911/71113.html |titel=Go – schnelle Programmiersprache von Google |datum=2009-11-11|abruf=2025-03-18 }}&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]] und [[Vererbung (Programmierung)|Vererbung]] von Klassen wird bewusst verzichtet. Außerdem ist es möglich, den [[Quelltext|Quellcode]] wie bei [[Java (Programmiersprache)|Java]] durch Pakete zu modularisieren.&lt;br /&gt;
&lt;br /&gt;
Nebenläufigkeit wird durch [[Communicating Sequential Processes]] realisiert, die &amp;#039;&amp;#039;Goroutinen&amp;#039;&amp;#039; genannt werden und über Kanäle &amp;#039;&amp;#039;(Channels)&amp;#039;&amp;#039; miteinander kommunizieren können. [[Generischer Typ|Generische Typen]] wurden in Version 1.18 eingeführt.&amp;lt;ref&amp;gt;{{Internetquelle |url=https://go.dev/doc/faq#generics |titel=go.dev – FAQ-Eintrag zu Generics |abruf=2022-03-17}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Unicode]] wird in Form von [[UTF-8]] unterstützt, sowohl für [[Zeichenkette|Strings]] als auch für Variablen[[bezeichner]] im Quelltext (allerdings nur Unicode-Buchstaben und -Ziffern), &amp;lt;code&amp;gt;Δt&amp;amp;#8239;=&amp;amp;#8239;t2&amp;amp;#8239;-&amp;amp;#8239;t1&amp;lt;/code&amp;gt; ist also möglich.&amp;lt;ref&amp;gt;[https://go.dev/doc/faq#unicode_identifiers go.dev – FAQ-Eintrag zu Unicode-Bezeichnern]&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;[https://go.dev/blog/declaration-syntax go.dev Blogeintrag zu Syntax für Deklarationen]&amp;lt;/ref&amp;gt; Code-Blöcke werden mit [[Klammer (Zeichen)#Geschweifte/geschwungene Klammern (Akkoladen)|geschweiften Klammern]] abgegrenzt. Neben dem einfachen [[Gleichheitszeichen]] als [[Zuweisung]]soperator 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)|Kommentar]], der auch mehrere Zeilen enthalten kann, &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt; leitet einen Kommentar 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 [[Funktion (Programmierung)|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 [[Einsprungpunkt]] des Go-Programms. Funktionen können mehrere Werte zurückgeben. Es ist üblich, als letzten [[Return Code|Rückgabewert]] den Status über den Erfolg oder Misserfolg des Funktionsaufrufs zu übermitteln und sogleich mit einer [[Bedingte Anweisung und Verzweigung|bedingten]] [[Kontrollstruktur]] zu überprüfen.&lt;br /&gt;
&lt;br /&gt;
Jede Variable hat einen definierten Typ. Jede Variable, mit Ausnahme des „Blank identifier“ &amp;lt;code&amp;gt;_&amp;lt;/code&amp;gt;, muss verwendet werden. Der „Blank identifier“ ignoriert eine Zuweisung, er ist ein anonymer [[Wildcard (Informatik)|Platzhalter]].&lt;br /&gt;
&lt;br /&gt;
Die Prüfung einer Bedingung in einer Kontrollstruktur wie &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt; wird anders als bei anderen Sprachen nicht von Klammern umschlossen.&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;
Das obige [[Hallo-Welt-Programm]] 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 nichtsequentielle 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, n)&lt;br /&gt;
	for k := 0; k &amp;lt; n; k++ {&lt;br /&gt;
		// alle n Werte nichtsequentiell berechnen&lt;br /&gt;
		go calcsubterm(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*4 //Die Leibniz-Reihe berechnet Pi/4&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// berechnet das k-Element der Leibniz-Reihe&lt;br /&gt;
func calcsubterm(ch chan&amp;lt;- float64, k float64) {&lt;br /&gt;
	ch &amp;lt;- 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 nichtsequentiell 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.141392653591793&amp;lt;/code&amp;gt;.&amp;lt;ref&amp;gt;[https://go.dev/play/p/GNj0Luvm2FU Berechnung von Pi auf dem Go-Playground] (Beispiel zur nichtsequentiellen Berechnung von Pi)&amp;lt;/ref&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;
== Typkonvertierung ==&lt;br /&gt;
&lt;br /&gt;
Anders als bei der Sprache C müssen Typen immer konvertiert werden. Es ist zum Beispiel nicht möglich, einen Wert vom Typ [[Integer (Datentyp)|Integer]] in einer Variable vom Typ [[Gleitkommazahl|Float]] zu speichern, ohne den Wert vorher zu konvertieren. Im folgenden Beispiel wird eine Variable vom Typ Integer deklariert und der Wert dieser Variable einer anderen Variable vom Typ Float zugewiesen. Man beachte, dass zwischen &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;uint&amp;lt;/code&amp;gt; unterschieden wird. 8-[[Bit]]-„Unsigned Integer“ &amp;lt;code&amp;gt;uint8&amp;lt;/code&amp;gt; umfassen einen Bereich von (0 … 255) während &amp;lt;code&amp;gt;int8&amp;lt;/code&amp;gt; einen Bereich von (−128 … 127) umfassen. Diese Vorgehensweise der strikten Typisierung ist sehr sinnvoll, da schwer zu findende [[Programmfehler|Programmierfehler]] so leichter erkannt werden können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
var i int = 100&lt;br /&gt;
var f float64 = float64(i)&lt;br /&gt;
var u uint = uint(f)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sofern bei der Deklaration direkt ein Wert zugewiesen wird, ist die explizite Nennung des Typs optional. Der Compiler ermittelt ihn anhand des Wertes oder der angegebenen Typenkonverterfunktionen. Auf Paketebene muss jede Anweisung mit einem Schlüsselwort beginnen, deshalb kann die folgende Kurzform nur innerhalb von Funktionen verwendet werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
i := 100&lt;br /&gt;
f := float64(i)&lt;br /&gt;
u := uint(f)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zeiger ==&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu vielen Hochsprachen wie Java arbeitet die Programmiersprache Go mit Zeigern. Ein Zeiger ([[Englische Sprache|englisch]] &amp;#039;&amp;#039;pointer&amp;#039;&amp;#039;) enthält als Wert die [[Speicheradresse|Adresse eines Speicherbereichs]]. Bestimmte Aufgaben können ohne Zeiger nicht programmiert werden. Dazu gehört die Übergabe von Werten an Funktionen ([[Referenzparameter|Call by reference]]). Im folgenden Beispiel wird eine Variable vom Typ Integer mit dem Namen „n“ und dem Wert 100 initialisiert. Anschließend wird die Speicheradresse, also die Adresse im Speicher des Computers ausgegeben. Die Adresse der Variable „n“ wird also mit &amp;lt;code&amp;gt;&amp;amp;n&amp;lt;/code&amp;gt; abgerufen. Die Syntax der Zeiger erinnert stark an die Sprache C.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
var n int = 100&lt;br /&gt;
fmt.Println(&amp;quot;Die Adresse der Variable:&amp;quot;, &amp;amp;n)&lt;br /&gt;
// Beispiel-Ausgabe: 0xc000018030&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im nächsten Beispiel wird wieder eine Variable vom Typ Integer mit dem Namen „n“ und dem Wert 100 initialisiert. Dann wird eine Pointer-Variable vom Typ Integer-Zeiger deklariert. Der Typ einer Zeiger-Variable wird durch einen führenden [[Sternchen (Schriftzeichen)|Asterisk]] (&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) vor dem [[Variablentyp]] deklariert. Aus &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; wird &amp;lt;code&amp;gt;*int&amp;lt;/code&amp;gt;. Anschließend wird die Speicheradresse der Variable „n“ als Wert der Zeiger-Variable „p“ deklariert. Daraufhin wird jene Adresse des Speichers ausgegeben, die von der Variable „n“ belegt wurde. Zuletzt wird jener Wert ausgegeben, der sich in der Speicheradresse befindet. Der Wert einer Speicherstelle, der in der Zeiger-Variable „p“ deklariert ist, kann mit &amp;lt;code&amp;gt;*p&amp;lt;/code&amp;gt; ermittelt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
var n int = 100&lt;br /&gt;
var p *int = &amp;amp;n&lt;br /&gt;
&lt;br /&gt;
// Gibt eine Speicheradresse aus, z. B. 0xc000018030&lt;br /&gt;
fmt.Println(&amp;quot;Adresse gespeichert in der Zeiger-Variable p:&amp;quot;, p)&lt;br /&gt;
&lt;br /&gt;
// Gibt den Wert an, der in der Speicheradresse steht: 100&lt;br /&gt;
fmt.Println(&amp;quot;Wert der Speicheradresse gespeichert in p:&amp;quot;, *p)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Zeiger-Adresse ohne gespeicherten Zeiger wird „nil pointer“ genannt. Man kann einfach abfragen, ob eine Zeigeradresse eine Speicheradresse als Inhalt hat oder nicht.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
if p != nil {&lt;br /&gt;
	// Wenn zutreffend: Zeiger-Variable speichert einen Zeiger auf einen Speicherbereich&lt;br /&gt;
}&lt;br /&gt;
if p == nil {&lt;br /&gt;
	// Wenn zutreffend: Zeiger-Variable speichert keinen Zeiger auf einen Speicherbereich&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im letzten Beispiel soll die Verwendung beim Aufruf einer Funktion dargestellt werden. Zuerst werden zwei Variablen vom Typ Integer deklariert. Der Inhalt dieser zwei Variablen soll getauscht werden.&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 &amp;quot;fmt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
func main() {&lt;br /&gt;
	a := 10&lt;br /&gt;
	b := 50&lt;br /&gt;
&lt;br /&gt;
	// Anzeige vor dem Tausch&lt;br /&gt;
	fmt.Println(&amp;quot;Wert der Variable a:&amp;quot;, a)&lt;br /&gt;
	fmt.Println(&amp;quot;Wert der Variable b:&amp;quot;, b)&lt;br /&gt;
&lt;br /&gt;
	// Aufruf der Funktion tauschen&lt;br /&gt;
	tauschen(&amp;amp;a, &amp;amp;b)&lt;br /&gt;
&lt;br /&gt;
	// Anzeige des Tausches&lt;br /&gt;
	fmt.Println(&amp;quot;Wert der Variable a:&amp;quot;, a)&lt;br /&gt;
	fmt.Println(&amp;quot;Wert der Variable b:&amp;quot;, b)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion tauschen&lt;br /&gt;
func tauschen(a, b *int) {&lt;br /&gt;
	tmp := *a&lt;br /&gt;
	*a = *b&lt;br /&gt;
	*b = tmp&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann also grob zusammenfassen, dass &amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt; die Speicheradresse einer Variable ermittelt, während &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; den gespeicherten Wert einer Speicheradresse ermittelt.&amp;lt;ref&amp;gt;[https://go.dev/tour/moretypes/1 A Tour Of Go – Pointers]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Objektorientierung ==&lt;br /&gt;
Go unterstützt objektorientierte Programmierung, sie ist jedoch nicht [[Klasse (Objektorientierung)|klassenbasiert]]. Datentypen können in Go [[Methode (Programmierung)|Methoden]] besitzen. [[Polymorphie (Programmierung)|Polymorphie]] wird über &amp;#039;&amp;#039;Interfaces&amp;#039;&amp;#039; ([[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 &amp;#039;&amp;#039;embedding&amp;#039;&amp;#039; („Einbettung“) genannt wird: Eine [[Datenstruktur]] kann beliebig viele andere Datentypen einbetten, sodass 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 Typ &amp;#039;User&amp;#039; ein&lt;br /&gt;
	Email string&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Ein Interface mit der Methode &amp;#039;Notify()&amp;#039;&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 &amp;#039;Notifier&amp;#039;, indem sie jeweils eine&lt;br /&gt;
// entsprechende &amp;#039;Notify()&amp;#039;-Methode haben. Eine vorherige Deklaration zur Implementierung&lt;br /&gt;
// ist nicht notwendig.&lt;br /&gt;
&lt;br /&gt;
func (u User) Notify() {&lt;br /&gt;
	fmt.Printf(&amp;quot;User: Sending user email to %s\n&amp;quot;, 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. The email address is %q.\n&amp;quot;,&lt;br /&gt;
		a.Name, // Verwenden des eingebetteten Feldes &amp;#039;Name&amp;#039; 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@example.com&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Eine Variable vom Interfacetyp anlegen&lt;br /&gt;
	var n Notifier&lt;br /&gt;
&lt;br /&gt;
	// Die implementierte Notify-Methode aufrufen&lt;br /&gt;
	// Die Methode wird über die Interfacevariable aufgerufen&lt;br /&gt;
	// Mittels dynamischer Bindung wird die Methode am richtigen Typ aufgerufen&lt;br /&gt;
	n = user&lt;br /&gt;
	n.Notify()&lt;br /&gt;
	n = admin&lt;br /&gt;
	n.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 &amp;#039;&amp;#039;(channels)&amp;#039;&amp;#039; genutzt, das eine relativ stark abstrahierte Möglichkeit der [[Synchrone Kommunikation|synchronen]] oder [[Asynchrone Kommunikation|asynchronen Kommunikation]] zwischen Go-Routinen bietet. Ein Kanal ist dabei ein Speicherbereich, der durch [[Semaphor (Informatik)|Semaphore]] abgesichert ist und eine [[Warteschlange (Datenstruktur)|Warteschlange]] (buffered/asynchronous channel) oder lediglich eine Schnittstelle (unbuffered/synchronous channel) zur Verfügung stellt.&amp;lt;ref&amp;gt;[https://go.dev/doc/effective_go#channels go.dev – Effective Go – Channels]&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://go.dev/doc/effective_go#chan_of_chan go.dev – Effective Go – Channels of channels]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Kanal wird durch den Aufruf &amp;lt;code style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;make(chan &amp;#039;&amp;#039;typ&amp;#039;&amp;#039;)&amp;lt;/code&amp;gt; (synchron) bzw. &amp;lt;code style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;make(chan &amp;#039;&amp;#039;typ&amp;#039;&amp;#039;, &amp;#039;&amp;#039;größe&amp;#039;&amp;#039;)&amp;lt;/code&amp;gt; (asynchron, wenn &amp;#039;&amp;#039;größe&amp;#039;&amp;#039; &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 (Informatik)|Deadlock]] auftreten, der 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, das zuerst nicht mehr blockiert, oder es wird im Fall mehrerer Optionen eine [[Pseudozufall|pseudozufällige]] Wahl getroffen.&lt;br /&gt;
&lt;br /&gt;
Daten werden mit &amp;lt;code style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;&amp;#039;&amp;#039;kanal&amp;#039;&amp;#039; &amp;lt;- &amp;#039;&amp;#039;Wert&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; in einen Kanal geschrieben und mit &amp;lt;code style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;&amp;#039;&amp;#039;variable&amp;#039;&amp;#039; = &amp;lt;-&amp;#039;&amp;#039;kanal&amp;#039;&amp;#039;&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 [[For-Schleife|Schleife]] verlassen wird, sobald der Channel geschlossen ist.&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 &amp;lt;code&amp;gt;main()&amp;lt;/code&amp;gt; die geschriebene Variable sofort wieder liest (und sie dabei aus dem Puffer entfernt) und &amp;lt;code&amp;gt;zehnMal()&amp;lt;/code&amp;gt; dadurch 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-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 &amp;#039;&amp;#039;self-hosting&amp;#039;&amp;#039;. Ursprünglich bestand der Compiler aus mehreren ausführbaren Kommandos, die unterschiedliche Namen je nach Ziel-Architektur hatten: „8&amp;amp;nbsp;g“ für [[x86-Architektur|x86]], „6&amp;amp;nbsp;g“ für [[AMD64|x86_64]], „5&amp;amp;nbsp;g“ für [[ARM-Architektur|ARM]]. Mit Version 1.5 wurden sie zu einem einzelnen ausführbaren Kommando zusammengefasst (&amp;#039;&amp;#039;go tool compile&amp;#039;&amp;#039;), und die Ziel-Architektur kann über die Umgebungsvariable &amp;#039;&amp;#039;GOARCH&amp;#039;&amp;#039; gewählt werden.&lt;br /&gt;
; Gccgo&lt;br /&gt;
: von Ian Taylor ist ein Go-[[Frontend und Backend|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://go.dev/doc/faq#Implementation go.dev – Häufig gestellte Fragen zur Implementierung]&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;[https://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;[https://sourceware.org/legacy-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 &amp;#039;&amp;#039;go&amp;#039;&amp;#039; begleitet, das als [[Fassade (Entwurfsmuster)|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]] &amp;#039;&amp;#039;(go get)&amp;#039;&amp;#039;, dem automatischen Formatieren von Quelltext &amp;#039;&amp;#039;(go fmt)&amp;#039;&amp;#039;, dem Ausführen von [[Modultest|Tests]] &amp;#039;&amp;#039;(go test)&amp;#039;&amp;#039;, dem Erzeugen von Dokumentation aus Quelltext-Kommentaren &amp;#039;&amp;#039;(go doc)&amp;#039;&amp;#039; oder dem Kompilieren des Projektes &amp;#039;&amp;#039;(go build)&amp;#039;&amp;#039;, sodass 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://go.dev/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;[https://opensource.googleblog.com/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;[https://go.dev/blog/go1 go.dev – Go version 1 is released]&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://go.dev/doc/go1compat go.dev – Go 1 and the Future of Go Programs]&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;[https://go.dev/blog/go1.1 go.dev – Go 1.1 is released]&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;[https://www.gophercon.com/ GopherCon]&amp;lt;/ref&amp;gt; in [[Denver]] statt, die seitdem jährlich stattfindet.&lt;br /&gt;
&lt;br /&gt;
== Maskottchen ==&lt;br /&gt;
[[Datei:The Go Gopher.jpg|300x300px|mini|Das Gopher-Maskottchen von Go]]&lt;br /&gt;
Das Go-[[Maskottchen]] ist eine [[Taschenratte]] (englisch &amp;#039;&amp;#039;Gopher&amp;#039;&amp;#039;). Es wurde von Renée French entworfen, die auch Glenda, das [[Plan 9 (Betriebssystem)|Plan-9]]-Häschen, entworfen hat. Das [[Logo (Zeichen)|Logo]] und das Maskottchen stehen unter der „[[Creative Commons]] Attribution 3.0“-Lizenz.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur |Autor=Alan A. A. Donovan, [[Brian W. Kernighan]] |Titel=The Go Programming Language |Verlag=Pearson Education |Datum=2015 |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;
   |Datum=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;
   |Datum=2010&lt;br /&gt;
   |ISBN=978-3-8273-3009-3}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Caleb Doxsey&lt;br /&gt;
   |Titel=An Introduction to Programming in Go&lt;br /&gt;
   |Datum=2012&lt;br /&gt;
   |ISBN=978-1-4783-5582-3&lt;br /&gt;
   |Sprache=en&lt;br /&gt;
   |Online=https://www.golang-book.com/}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Andreas Schröpfer&lt;br /&gt;
   |Titel=Go – Das Praxisbuch&lt;br /&gt;
   |Verlag=dpunkt.verlag&lt;br /&gt;
   |Datum=2020&lt;br /&gt;
   |ISBN=978-3-86490-713-5}}&lt;br /&gt;
* {{Literatur&lt;br /&gt;
   |Autor=Kristian Köhler&lt;br /&gt;
   |Titel=Microservices mit Go&lt;br /&gt;
   |Verlag=Rheinwerk Verlag&lt;br /&gt;
   |Datum=2020&lt;br /&gt;
   |ISBN=978-3-8362-7559-0}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://go.dev/ Offizielle Website] (englisch)&lt;br /&gt;
** [https://go.dev/ref/spec Spezifikation] (englisch)&lt;br /&gt;
** [https://go.dev/tour/ Eine interaktive Einführungs-Tour] (englisch)&lt;br /&gt;
* Übersetzungen (deutsch)&lt;br /&gt;
** [https://www.bitloeffel.de/DOC/golang/go_spec_de.html Sprachbeschreibung usw.]&lt;br /&gt;
* [https://go.dev/talks/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 ([https://go.dev/talks/2009/go_talk-20091030.pdf Präsentationsfolien] (PDF; 242&amp;amp;nbsp;kB))&lt;br /&gt;
* [https://gobyexample.com/ Go by example] (englisch)&lt;br /&gt;
* [https://opensource.archium.org/index.php/Der_Golang-Spicker#Ein_Go-Spickzettel_.28.22Cheat_Sheet.22.29 Der Golang-Spicker] – kompakte Übersicht (deutsch)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references responsive /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Navigationsleiste Google-Programmiersprachen}}&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=7725033-3|LCCN=sh2012000746}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprache]]&lt;br /&gt;
[[Kategorie:Google-Software]]&lt;br /&gt;
[[Kategorie:Freies Programmierwerkzeug]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Baumfreund-FFM</name></author>
	</entry>
</feed>