Einstieg in Google Go
1 Warum nicht mal eine Partie Go?
Google hat mit Go eine neue experimentelle Programmiersprache vorgestellt. Sie verbindet die Ausführungsgeschwindigkeit und Typsicherheit von Sprachen wie C, C++ und Java mit der syntaktischen Leichtgewichtigkeit dynamischer Programmiersprachen wie Python oder Ruby. Go erhöht die Produktivität von Programmierern durch eine effektive Unterstützung von massiv nebenläufigen Anwendungen und stellt sogenannte GoRoutinen für diese Aufgabe zur Verfügung.
Die Ausführung der GoRoutinen übernimmt ein Thread Pool, welcher die Verteilung auf Betriebssystem-Threads realisiert. Es können mit geringem Overhead tausende von GoRoutinen parallel ausgeführt werden. Der erste Teil dieses Shortcuts führt mit vielen praktischen Beispielen in die Sprache Go ein. Im zweiten Teil widmen wir uns der Realisierung paralleler Konzepte.
Historie
Im September 2007 begannen Robert Griesemer, Rob Pike und Ken Thompson mit der Skizzierung einer neuen Programmiersprache bei Google. Ende 2008 kam Russ Cox in das Team, das mittlerweile Vollzeit an der Sprache arbeitete. Ein weiteres Jahr später, im November 2009, wurde Go unter einer BSD-Lizenz veröffentlicht [1]. Seitdem hat das Projekt enorm Traktion bekommen und ist seit der Google-IO-Konferenz 2011 auch in Googles App Engine verfügbar. Das Hauptziel bei der Entwicklung von Go war es, eine leichtgewichtige, ausdrucksstarke Syntax mit der Unterstützung von Nebenläufigkeit zu kombinieren. Dabei war es den Sprachdesignern wichtig, die Nebenläufigkeit direkt als Teil der Sprache zu konzipieren. Das gibt es außer bei Go sonst nur bei eher exotischen Sprachen wie Erlang, Clojure, Scala und D. Alle anderen Sprachen wie C/C++, Java und C# realisieren Parallelität durch eine Bibliothek oder durch Compilererweiterungen (Cilk, OpenMP). Die Go-Webseite [2] ist eine gute Quelle für alle Informationen rund um die verschiedenen Aspekte der Programmierung mit Go und nicht zu vergessen: das Go-Maskottchen Gordon, das Erdhörnchen (engl. gopher) ( Abb. 1.1 ).
Abbildung 1.1: Google Go und Gordon (Quelle: Google [licensed under Creative Commons Attribution3.0])
Nach vielen kleineren Updates und Releases stellten die Go-Entwickler am 5. Oktober 2011 ihren Plan vor [3], eine langlebige Go-Version 1.x freizugeben. Die Motive für dieses Release sowie dessen technische Inhalte wurden auf der Go-Mailingliste (GoNuts) zwischen den Go-Entwicklern und der Go-Community intensiv und kontrovers diskutiert [4], [5].
Hallo Welt, mal anders …
Im Folgenden wird ein „Hello World!“-Programm vorgestellt. Anders als in einem typischen „Hello World“-Programm wird hier allerdings der Text nicht auf der Standardausgabe ausgegeben, sondern wird von Gos eigenem HTTP-Server aus der Standardbibliothek gehostet und kann in einem Browser angezeigt werden. Anhand dieses kleinen Beispiels werden einige Konzepte wie Interfaces, Pakete, Funktionen, Methoden, eingebaute Datentypen vorgestellt und hergeleitet:
package main
import (
"fmt"
"http"
)
func HelloString(s string) string {
return "Hello, " + s + "!"
}
func Hello(w http.ResponseWriter, r *http.Request) {
if len(r.URL.Path) == 1 {
fmt.Fprintln(w, "Hello,", "World!")
} else {
fmt.Fprintln(w, HelloString(r.URL.Path[1:]))
}
}
func main() {
http.HandleFunc("/", Hello)
if err := http.ListenAndServe(":1234", nil); err != nil {
fmt.Println(err)
}
}
Listing 1.1: hello.go
Wer dieses kleine Beispiel gleich an seinem Rechner ausprobieren möchte, kann es nach der Installation [6] entweder von Hand kompilieren, oder sich direkt ein Go-konformes einfaches Makefile erzeugen (Listing 1.2).
include $(GOROOT)/src/Make.inc
TARG=hello
GOFILES=\
hello.go
include $(GOROOT)/src/Make.cmd
Listing 1.2: Makefile
Pakete, Kommandos und Namensräume
In Go werden Kommandos, also ausführbare Programme wie das vorliegende Beispiel, und Bibliotheken in eigenen Namensräumen bzw. Paketen untergebracht. Kommandos unterscheiden sich von Bibliotheken insofern, dass sie in einem speziellen Paket, dem main -Paket, implementiert werden und eine Funktion namens main enthalten müssen. Generell können Pakete mit dem Schlüsselwort import eingebunden werden. In dem vorliegenden Beispiel wird also ein Kommando implementiert, das die Pakete fmt und http einbindet. Diese Pakete gehören zur Standardbibliothek. Das fmt -Paket implementiert Funktionen zur formatierten Ein- und Ausgabe. Diese Funktionen ähneln denen, die in C mit printf und scanf zur
Weitere Kostenlose Bücher