Bücher online kostenlos Kostenlos Online Lesen
Einstieg in Google Go

Einstieg in Google Go

Titel: Einstieg in Google Go
Autoren: Dr. Mario Deilmann , Christian Himpel
Vom Netzwerk:
Verfügung stehen. Durch das Importieren von http wird unter anderem ein HTTP-Server eingebunden, der später zur Ausgabe von „Hello World!“ benutzt wird.
    Zeichenketten
    Wie Funktionen definiert werden, kann man anhand der Funktion HelloString erkennen. Funktionen beginnen mit dem Schüsselwort func , auf den Bezeichner folgt die Argumentenliste und abschließend werden die Rückgabewerte aufgelistet. Variablen werden „rückwärts“ definiert: s string ist eine Zeichenkette mit dem Bezeichner s . Der Rückgabewert von HelloString wird durch Konkatenation von drei Zeichenketten erzeugt. In Go sind Zeichenketten unveränderbar, d. h. die vorliegende Konkatenation Hello, " + s + "! erzeugt eine neue Zeichenkette. Zeichenketten sind eigene Objekte, deren Länge in Bytes über die eingebaute Funktion len ermittelt werden kann, z. B. len("hello") == 5 . In Go werden Zeichenketten und Quelltext in UTF-8 kodiert, womit es möglich ist, beliebige Unicode-Zeichen in seinem Quelltext zu verwenden.
    Zeiger
    Widmen wir uns als Nächstes der Funktion Hello . Diese Funktion erwartet zwei Argumente. Das erste Argument ist ein Interface vom Typ http.ResponseWriter , das verschiedene Methoden zur Verfügung stellt. Interfaces werden später noch genauer erläutert. Das zweite Argument ist ein Zeiger auf einen http.Request . In Go werden (fast) alle Werte „by Value“ übergeben, deshalb kennt Go das Zeiger-Argument. Zeiger werden wie in C mit einem Sternchen (*) spezifiziert und genauso können Zeigervariablen durch Voranstellen eines Sternchens dereferenziert werden. Die Adresse einer Variable kann wie in C durch Voranstellen eines kaufmännischen Und-Zeichens ( & ) erzeugt werden. Hier gibt es jedoch zwei bedeutende Unterschiede zu C. Während man in C zur Erzeugung einer Variablen auf dem Heap explizit malloc rufen muss, wird das in Go automatisch vom Compiler erledigt. Das heißt, dass der Compiler eine Variable automatisch auf dem Heap erzeugt, wenn einmal eine Adresse von ihr genommen wurde. Deshalb kann man z. B. Zeiger auf vermeintlich lokale Variablen einer Funktion zurückgeben lassen. Da Go eine automatische Garbage Collection besitzt, muss man sich über das Aufräumen dieser Objekte keine Gedanken machen. Der zweite wichtige Unterschied zu C ist, dass es keine Zeigerarithmetik gibt. Man kann also einen Zeiger nicht an beliebige Stellen im Speicher zeigen lassen. Außerdem verbietet es automatische oder implizite Typkonvertierungen. Deshalb kann man Go als streng typisierte Sprache bezeichnen.
    Funktionsweise des Beispiels
    Im Funktionsrumpf von Hello wird mittels einer If -Bedingung zwischen zwei Fällen unterschieden. Wenn der vom Client (z. B. Browser) angeforderte Pfad die Länge 1 hat, also nur den Schrägstrich enthält, dann antworten wir dem Client mit Hello, World!\n . Andernfalls wird dem Client mit dem übergebenen Pfad geantwortet. Steuert man mit dem Browser z. B. auf http://localhost:1234/ , dann antwortet der Go-HTTP-Server mit Hello, World!\n . Surft man allerdings http://localhost:1234/Entwickler an, antwortet der Server mit Hello, Entwickler!\n .
    If-Bedingung und implizite Dereferenzierung
    Nun aber zur Erklärung, was eigentlich passiert. Wie wir in einem vorigen Abschnitt schon gesehen haben, kann die Länge einer Zeichenkette mit dem eingebauten Schlüsselwort len bestimmt werden. Genau das wird im Vorliegenden auch getan mit len(r.URL.Path) . Das http.Request ist die Instanz eines Go struct . Diese Struktur hat viele Felder. Im Folgenden werden zwei Felder von http.Request gezeigt (Listing 1.3).
    type Request struct {
Method string // GET, POST, PUT, etc.
URL *url.URL // Parsed URL.
//...
}
    Listing 1.3
    Das erste Feld Method ist eine Zeichenkette, welche die HTTP-Methode, die bei der Anfrage benutzt wurde, enthält. Das zweite Feld ist wieder ein Zeiger auf eine weitere Struktur vom Typ url.URL . Die url.URL -Struktur enthält einen vollständig geparsten URL. Ein Feld davon ist nun der Pfad, der bei der Anfrage im URL angegeben wurde, URL.Path . Mit r.URL.Path wird im Beispiel also auf genau diesen Pfad zugegriffen. Obwohl es sich bei r dem *http.Request um einen Zeiger handelt, wird die Dereferenzierung vom Compiler automatisch durchgeführt. Man kann also auf Felder (und auch Methoden) von Strukturen ohne einen expliziten Dereferenzierungsoperator, wie er in C/C++ benötigt wird, zugreifen.
    Namensräume und Funktionen
    Als Nächstes werden wir uns genauer anschauen, wie der Text
Vom Netzwerk:

Weitere Kostenlose Bücher