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:
Länge von Zeichenketten kann die Länge von Slices auch mit der eingebauten Funktion len ermittelt werden. Für Slices gibt es allerdings auch noch eine zweite eingebaute Funktion cap , mit der man die Kapazität bestimmen kann. Die Kapazität ist immer größer oder gleich der Länge und gibt an, wie viele Elemente sich noch hinter dem sichtbaren Bereich im Slice befinden. Im Beispiel oben war len(w) == 3 , aber da wir diesen Bereich aus dem größeren Slice v ausgeschnitten haben, ist die Kapazität cap(w) == 5 .
    Interfaces
    Wollen wir nun auf die verschiedenen Typen eingehen, die hier in der Funktionsdefinition von Fprintln benutzt werden. Bis auf den Rückgabewert n sind alles Interfaces. Also io.Writer , interface{} und os.Error sind Interfaces aus verschiedenen Standardbibliothekspaketen und gehören zu den klassischen Go-Konventionen. Was sind nun Interfaces? In Go gibt es keine strenge Typhierarchie wie in C++ oder Java. Stattdessen kennt Go das Konzept der Interfaces, die sich aber erheblich von den bekannten Java-Interfaces unterscheiden.
    Methoden
    Bevor wir uns näher mit den Interfaces befassen, soll an dieser Stelle noch kurz eingeführt werden, was Methoden sind und wie sie implementiert werden. Bisher haben wir nur Funktionen wie HelloString und Hello kennengelernt. Funktionen unterscheiden sich von Methoden insofern, dass sie für sich alleine implementiert sind. Methoden können innerhalb von Paketen für fast alle Typen definiert werden (Ausnahmen: Interfacetypen und Zeigertypen). Nun wollen wir die HelloString -Funktion zu einer Methode umwandeln. Ziel dieser Übung ist es, die Anzahl der Aufrufe an HelloString mitzuzählen. Dazu definieren wir zunächst einen neuen Typ State :
    type State int
// Remembers the number of calls to HelloString.
    Ähnlich wie in C mit typedef haben wir aus int einen neuen Typ erzeugt. Im nächsten Schritt verändern wir HelloString so, dass es eine Methode von State wird, welche die Anzahl der Aufrufe mitzählt:
    func (st *State) HelloString(s string) string {
*st++
return "Hello, " + s + "!"
}
    Wir schreiben also vor dem Bezeichner der Methode den Typ, an der sie hängen soll. In diesem Fall ist also ein Zeiger auf State das Ziel der Methode, und wir können über die Variable st darauf zugreifen.
    Zurück zu den Interfaces
    Ein Interface ist ein Typ, der eine Menge von Methoden spezifiziert. Jeder Typ, der nun alle Methoden eines Interfaces implementiert, kann implizit als dieses Interface behandelt werden. Das Interface Writer aus dem io -Paket ist z. B. folgendermaßen definiert:
    type Writer interface {
Write(p []byte) (n int, err os.Error)
}
    Das bedeutet, dass jeder Typ, der eine solche Write -Methode implementiert, gleichzeitig und automatisch das io.Writer -Interface erfüllt. Wie man im Beispiel sieht, wird w vom Typ http.ResponseWriter in der Funktion Fprintln wie ein io.Writer benutzt. Schauen wir uns nun den http.ResponseWriter etwas genauer an (Listing 1.4).
    type ResponseWriter interface {
// Write writes the data to the connection as part
// of an HTTP reply
Write([]byte) (int, os.Error)
//...
}
    Listing 1.4
    Wie anfangs erwähnt, sehen wir nun, dass http.ResponseWriter ein Interface ist, das die Write -Methode so implementiert, wie sie von io.Writer gefordert wird. Allein diese Tatsache macht aus dem Interface http.ResponseWriter auch ein Interface vom Typ io.Writer . Weitere Erkenntnisse und Konventionen in Go kann man hieraus gewinnen. Die Interfacebezeichner enden (fast) immer auf Writer , wenn sie die Write -Methode im Sinne des io.Writer implementieren. Analog verhält es sich mit io.Reader . Werden mehrere Interfaces miteinander verknüpft, so bilden sich daraus Namen, wie io.ReadWriter oder io.ReadWriteCloser . Dies ist eine Konvention, welche die Lesbarkeit des Quelltextes verbessern soll. Diese kann selbstverständlich gebrochen werden, auch wenn das nur in wenigen Fällen ratsam ist.
    Die „main“-Funktion
    Gehen wir im Beispiel nun zur main -Funktion. main bekommt keine Argumente und liefert kein Ergebnis zurück. Kommandozeilenargumente werden von Go über die Laufzeitumgebung im Paket os im Slice Args gespeichert. Das Paket flag bietet einen Options-Parser an. Um einen Fehlerstatus zurückzugeben, wird die Funktion os.Exit verwendet. Innerhalb von main wird als Erstes die Funktion Hello mittels http.HandleFunc im Go-HTTP-Server als Callback-Funktion registriert. Werfen wir noch einen kurzen Blick auf die Funktionsdefinition von
Vom Netzwerk:

Weitere Kostenlose Bücher