{{{#!vorlage Hinweis Das gleichnamige asiatische Brettspiel ist unter [:Spiele/Go:] zu finden. }}} [[Vorlage(Getestet, bionic, jammy)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(2)]] [[Bild(gopher.png, 96, align=left)]] [[Bild(go_logo.png, 150, align=right)]] [wikipedia:Go_(Programmiersprache):Go] ist eine seit 2009 von Google entwickelte [:Programmiersprache:] mit Ähnlichkeiten zu C++, Java und Erlang. Sie ist kompilierbar, nebenläufig und besitzt eine automatische Speicherbereinigung. Zur Zeit wird Go für Linux, Mac OS X, FreeBSD und Windows angeboten, es ist also weitestgehend plattformunabhängig. Durch die umfangreiche Standardbibliothek werden von Haus aus z.B. Netzwerkprogrammierung (TCP, HTTP), formatierte Textein- und -ausgabe, Kryptographie, Systemaufrufe etc. unterstützt. Ende März 2012 wurde die Version 1.0 [https://www.heise.de/developer/meldung/Googles-Programmiersprache-Go-in-Version-1-0-veroeffentlicht-1486035.html veröffentlicht] {de}. Seitdem ist die Sprache keinen inkompatiblen Änderungen mehr unterworfen. Hilfe beim Einstieg bietet die offizielle [https://golang.org/ Homepage] {en} golang.org, wo es eine interaktive Einführungs-Tour, Hinweise zum effektiven Programmieren mit Go, Videos, Antworten zu häufig gestellten Fragen (FAQ) und Dokumentation der Standardbibliothek gibt. Ein Aspekt, der Go von älteren Programmiersprachen wie C++ abhebt, ist die Verwendung des gesamten UTF-8 Zeichensatzes im Quelltext. Dies gilt sowohl für Variablennamen als auch in der Textausgabe. Somit bleiben z.B. Probleme mit Umlauten aus. Weiteres zu den Besonderheiten unter [#Mehr-zur-Syntax Syntax]. Aufgrund der Gleichheit des Namens der Programmiersprache zum englischen Verb „go“ und zum japanischen Brettspiel, hat sich die Verwendung von „golang“ (Kurzform für „Go Language“) bei der Suche im Web, Hashtags etc. eingebürgert. = Installation = {{{#!vorlage Hinweis Wer Go ohne Installation direkt im Web ausprobieren möchte, kann dies im [https://golang.org/ Go Playground] {en} tun. Allerdings werden hier aus Sicherheitsgründen nicht alle Bibliotheksfunktionen unterstützt. }}} == Aus den Paketquellen == Go ist in den offiziellen Paketquellen enthalten: {{{#!vorlage Paketinstallation golang, main }}} Darin enthalten sind Compiler, Linker und verschiedene [#Tool-bersicht Werkzeuge] zur Formatierung des Quellcodes oder zum Nachinstallieren von Bibliotheken. Offizielle Download Seite aller golang Versionen und der aktuellsten Version: [https://golang.org/dl/ Download Go] {en} == Snap == Die aktuelle stabile Version ist auch als [:snap:]-Paket verfügbar, welches von Canonical bereit gestellt wird. Es kann wie folgt installiert werden[2]: {{{#!vorlage Befehl sudo snap install go --classic }}} Wer Go mit kryptografischen Routinen, die dem [wikipedia:Federal_Information_Processing_Standard:FIPS-Standard] entsprechen, benötigt, muss {{{#!vorlage Befehl sudo snap install go --channel=1.21-fips/stable --classic }}} als Befehl zum Installieren nutzen. = Entwicklungswerkzeuge = Go-Programme können natürlich mit jedem [:Editoren:Editor] erstellt werden, viele Editoren unterstützen aucn Syntax-Highlighting für Go. Eine vollständige IDE für Go ist im folgenden beschrieben: [[Bild(liteide.png, 48, align=right)]] == GolangIDE == Sucht man eine vollständige Entwicklungsumgebung, sollte man sich [https://github.com/visualfc/liteide GolangIDE] {en} ansehen, eine auf Go spezialisierte Version der Entwicklungsumgebung LiteIDE. Sie unterstützt einiges, was den Programmieralltag erleichtert: * Syntax-Highlighting, konfigurierbar * Projektmanagement * Gut integriertes Debugging * Automatische Formatierung des Quellcodes mit [#Tool-bersicht gofmt] * Baumansicht von Funktionen und Variablen * Übersichtliche Bedienung et cetera. Zur Zeit wird sie auf der Projektseite für Linux, Windows und Mac OS X als [https://sourceforge.net/projects/liteide/files LiteIDE] {dl} angeboten. {{{#!vorlage Hinweis Eventuell bekommt man beim Kompilieren eines Programms eine Fehlermeldung, da LiteIDE den Compiler im falschen Pfad sucht oder Standardbibliotheken wie "fmt" nicht findet. In dem Fall muss man im LiteIDE-Ordner unter '''/usr/share/liteide/environment/''' die Datei '''linux32.env''' oder je nach Architektur '''linux64.env''' editieren und die enthaltenen Variablen anpassen: {{{#!code bash GOROOT=/usr/lib/go GOBIN=/usr/bin GOARCH=amd64 #(oder GOARCH=386 bei 32-Bit Systemen) GOOS=linux \}}} Nach dem Speichern muss man in LiteIDE in der Dropdown-Liste der oberen Toolbar die editierte Datei auswählen, dann sollte es funktionieren! }}} = Das erste Programm = Für den Anfang wird wie gewöhnlich nichts als der eben installierte Compiler und ein Texteditor (zum Beispiel [:gedit:Gedit]) benötigt. Man öffnet diesen und legt die Datei '''first.go''' an: {{{#!code go // Datei first.go /* Erstes Go-Programm */ package main import "fmt" func main() { fmt.Println("Hallo golang!") fmt.Println("Hallo 世界!"); } }}} {{{#!vorlage Tabelle <-2 rowclass="titel"-2> Erläuterung +++ Zeile Bedeutung +++ 1+2 Kommentare, wie in C++ oder Java +++ 4 Name des Pakets des Programms, Standard ist "`main`" +++ 6 Das Paket "`fmt`" aus der Standardbibliothek wird eingebunden. Es stellt formatierte Textein/-ausgabe ähnlich print-/scanf zu Verfügung. +++ 8 Hauptfunktion des Programms ohne Parameter oder Rückgabewert. Funktionen werden in Go mit dem Schlüsselwort "`func`" eingeleitet. +++ 9 Die Funktion "`Println`" aus dem importierten Paket "`fmt`" wird per Punktoperator aufgerufen. Als Parameter steht hier der String "`Hallo golang!`". Möglich sind aber auch Variablen, Objekte oder Funktionsaufrufe (mit Rückgabewert). +++ 10 Erneut die funktion "`Println`", diesmal mit chinesischen Schriftzeichen. Wie bereits erwähnt, kann der gesamte UTF-8 Zeichensatz verwendet werden. Dieser Funktionsaufruf wird mit einem __Semikolon__ abgeschlossen. Dies ist zwar wie oben nicht erforderlich und in Go auch nicht üblich, aber trotzdem möglich. +++ 11 Die main-Funktion wird geschlossen. }}} Nun wird der Quelltext ausgeführt: {{{#!vorlage Befehl go run first.go }}} Wenn man eine ausführbare Datei erhalten möchte, kann man den Quelltext alternativ mit folgendem Befehl kompilieren und anschließend ausführen: {{{#!vorlage Befehl go build first.go ./first }}} Die Ausgabe des Programms sieht so aus: {{{#!vorlage Befehl Hallo golang! Hallo 世界! }}} = Mehr zur Syntax = Go verfügt gegenüber altbewährten Programmiersprachen über einige interessante Neuerungen, oder kombiniert zumindest Vorteile einzelner Sprachen miteinander. == Variablen == In Go gibt es verschiedene Möglichkeiten, Variablen zu deklarieren und zu initialisieren: {{{#!code go // Beispiel 1 var txt1 string // Deklaration txt1 = "zugewiesen" // Initialisierung // Beispiel 2 txt2 := txt1 // Deklaration und Initialisierung in Einem }}} Hier wird zunächst die Variable "`txt1`" mit dem Schlüsselwort "`var`" (bekannt aus JavaScript) vom Typ "`string`" deklariert. Auffällig ist, dass im Gegensatz zu anderen Sprachen der C-Familie der Typ der Variable __hinter__ dem Namen steht. Im nächsten Schritt wird dann der Variable ein String zugewiesen. Das zweite Beispiel arbeitet mit dem Zuweisungsoperator "`:=`". Dieser kombiniert die beschriebenen Schritte: er legt eine Variable "`txt2`" an und weist ihr den Wert von "`txt1`" zu. Hier muss kein Typ angegeben werden, da der Compiler diesen automatisch aus dem zugewiesenen Wert (hier string) erkennt. Dieses Vorgehen nennt sich ''Typinferenz''. == Funktionen == Funktionen können in Go sehr umfangreich definiert werden: {{{#!code go func (t typ) Funktionsname(q int) (r, s int) { return 0, 0 } }}} Wie bereits erwähnt, wird jede Funktion mit dem Schlüsselwort "`func`" eingeleitet. Im folgenden wird die Syntax dieses Prototyps erläutert: {{{#!vorlage Tabelle Erläuterung +++ Teil Optional Beschreibung +++ `(t typ)` ja Funktionen können auf einen bestimmten Typen festgelegt werden, z.B. nur Strings / TCP-Connections etc., so dass sie objektorientierte Methoden bilden +++ `Funktionsname` nein Der Name der Funktion, über den sie später aufgerufen wird. Muss __groß__ geschrieben werden, wenn die Funktion __in anderen Paketen nutzbar__ sein soll! +++ `(q int)` jein; () erforderlich Deklaration der Parameter, die der Funktion übergeben werden können +++ `(r, s int)` ja Deklaration der Rückgabewerte der Funktion. Richtig, in Go können Funktionen __mehrere Werte zurückgeben__! Dazu später mehr. +++ `return 0, 0` nein Return-Anweisung, beendet die Funktion und gibt den/die Wert/Werte zurück }}} === Beispiel 1 === {{{#!code go func merge(a, b string) (string, string, string) { return a+b, a, b } }}} Die Funktion "merge" akzeptiert zwei Strings als Parameter. Diese werden dann zusammengefügt und jeweils einzeln zurückgegeben. Die Funktion ist also vom Typ `string` und hat 3 Rückgabewerte. Nun gibt es verschiedene Möglichkeiten, diese Funktion zu nutzen: {{{#!code go // Möglichkeit 1 add, a, b := merge("zusammen", "führen") fmt.Println(add) fmt.Println(a) fmt.Println(b) }}} Hier werden die drei neuen Variablen `add`, `a` und `b` per Zuweisungsoperator deklariert und mit den drei Rückgabewerten der Funktion "`merge`" initialisiert. Die Ausgabe wäre dem entsprechend: {{{ zusammenführen zusammen führen }}} Nun kann es z.B. bei Funktionen der Standardbibliothek vorkommen, das diese mehrere Werte zurückgeben, man allerdings nur mit einem arbeiten möchte. Würde man diese Werte allerdings beim Aufruf einfach ignorieren, gäbe es einen Compiler-Fehler. Abhilfe schafft hier die pseudo-Variable "`_`" (als Beispiel dient hier die oben definierte Funktion "`merge`"): {{{#!code go // Möglichkeit 2 add, _, _ := merge("zusammen", "führen") fmt.Println(add) }}} Ausgegeben wird hier nur noch: {{{ zusammenführen }}} Jetzt wird nur noch das zusammengeführte Ergebnis der Variablen "`add`" zugewiesen, die beiden anderen Werte werden den Pseudovariablen. Somit werden sie respektiert, aber direkt verworfen. Sinn ergibt dies zum Beispiel, wenn man bei einem Schreibvorgang nicht an der Anzahl der geschriebenen Bits interessiert ist. === Beispiel 2 === {{{#!code go func printStuff() { fmt.Println("Some stuff....") } }}} Natürlich geht es auch ganz rudimentär: Diese Funktion braucht keine Parameter und gibt keine Werte zurück. {{{#!vorlage Hinweis Die Funktions-Syntax zu kennen, ist wichtig, um die [http://golang.org/pkg/ Paketdokumentation] {en} zu verstehen! }}} == Nebenläufigkeit - Concurrency == Ein weiteres Schmankerl der neuen Programmiersprache ist die sogenannte "Nebenläufigkeit". Dieses von [wikipedia:Communicating_Sequential_Processes:Communicating Sequential Processes] inspirierte Feature ermöglicht es, auf vergleichsweise einfache Weise parallel zu programmieren, eine Art Thread-Programmierung: {{{#!code go package main import ( "fmt" "time" ) func wake(zeit time.Duration, grund string) { time.Sleep(zeit) fmt.Println("Zeit abgelaufen: ", grund) } func main() { go wake(180*time.Second, "Tee!") go wake(200*time.Second, "Wichtiger Termin!") time.Sleep(500 * time.Second) } }}} Zuerst wird die Funktion "`wake`" definiert. Sie akzeptiert als Parameter eine Zeit (in Sekunden) und einen Grund als String. Wird sie aufgerufen, wartet sie die übergebene Zeit und gibt dann eine Meldung mit dem Grund des Aufrufs aus. Das Entscheidende kommt erst in der main-Funktion: Die Funktion "wake" wird hier mit dem Schlüsselwort `go` aufgerufen. Ohne `go` würde die zweite wake-Funktion erst aufgerufen werden, wenn die erste beendet wird, also nach 3 Minuten. Ein `go` startet die Funktionen jedoch nebenläufig, also parallel. So wird man nach 3 Minuten an den Tee, und 20 Sekunden später an den wichtigen Termin erinnert. Im Gegensatz zu diesem Beispiel ist die einfache Nebenläufigkeit z.B. bei Spielen erforderlich, wo gleichzeitig die Eingaben vom Benutzer interpretiert werden, und im Hintergrund z.B. Timer laufen. Die Sleep-Funktion danach ist hier erforderlich, da sich sonst nach den Funktionsaufrufen das Hauptprogramm und somit auch die sog. Go-Routinen beenden würden. Professionell ist das nicht, da man meistens nicht weiß, wie lange man warten muss. Dann würde man die Routinen entweder zu früh abwürgen oder unnötig Rechenzeit verschwenden. = Tool-Übersicht = Das Paket '''golang''' enthält viele Programme zur Go-Programmierung. Hat man Go über das snap-Paket installiert, sind nur die Befehl `go` und `gofmt` verfügbar. Im folgenden eine Auswahl der wichtigsten Hilfsprogramme: {{{#!vorlage Tabelle Tools +++ Befehl Bedeutung +++ `go tool compile program.go` Compiler, Übersicht der Argumente in der [https://golang.org/cmd/ cmd Dokumentation] {en}. Ab Version go 1.5 existiert nur noch ein compiler tool Programm: [https://golang.org/cmd/compile/ compile Dokumentation] {en} Die Konfiguration geht jetzt über die Umgebungsvariablen GOOS und GOARCH. Beispiel: build und link ein Program auf amd64 für Darwin: export GOOS=darwin GOARCH=amd64 +++ `go tool link program.o` Ab Version go 1.5 existiert nur noch ein linker tool Programm: [https://golang.org/cmd/link/ link Dokumentation] {en} +++ `go tool cgo GODATEI(EN)` Compiler für Go-Programme, die C-Code beinhalten +++ `gofmt` Formatiert Quellcode nach dem festgelegten Schema. +++ `go install BIBLIOTHEK` Befehl für die Installation von zusätzlichen Bibliotheken wie von [https://github.com github] etc., z.B. für Audio oder Grafik. }}} = Links = * [https://golang.org/ Homepage] {en} Offizielle Go Webseite golang.org * [https://golang.org/pkg/ Paketdokumentation] {en} * [http://www.golang-book.com/ An Introduction to Programming in Go] {en} von Caleb Doxsey: kosrenloses Buch zum Lernen von Go * [https://www.softcover.io/downloads/88e295ad/GoBootcamp GoBootcamp] {en} Link kostenfreies Buch: GoBootcamp * [http://groups.google.com/group/golang-nuts Golang-nuts Mailinglist] {en} - Googlemail-Adresse erforderlich * [https://tour.golang.org/welcome/1 A tour of Go] {en} * [http://wh3rd.net/practical-go/#%281%29 Go Presentation] {en} Go Präsentation von Andrew Gerrand * [http://helmbold.de/artikel/pro-contra-go Pro und contra Go] {de} * [http://www.bitloeffel.de/DOC/golang/go_spec_de.html deutschsprachige Go-Spezifikation] {de} * [https://gobyexample.com Go-Beispiele] {en} Einführung in Golang mit gut ausgewählten Codebeispielen * [https://dave.cheney.net/resources-for-new-go-programmers Go-Tips] {en} Go Tips und Links für Neulinge von Dave Cheney * [http://stackoverflow.com/questions/tagged/go Go-Fragen] {en} Grosses Fragen-Antworten Portal fuer Go * [http://www.gopl.io/ The Go Programming Language] {en} Link zum Buch: The Go Programming Language, Donovan · Kernighan * [https://miek.nl/go Learning Go] {en} Link kostenfreies Buch: Learning Go, Miek Gieben #tag: Programmierung