© StonePictures/Shutterstock.com
Kolumne: Die Golumne

Kolumne: Die Golumne


Mit der zunehmenden Beliebtheit von Go als Sprache für Webanwendungen häufen sich in den entsprechenden Foren bei Slack, StackOverflow oder Reddit die Fragen nach dem Multiplexing, also dem Verteilen der Anfragen auf die hierfür zuständigen Funktionen. Für diese Aufgabe gibt es inzwischen diverse stark verbreitete Lösungen, beispielsweise gorilla/mux. Doch sie bringen neben ihren Features auch einige Nachteile mit sich. Etwa ein für viele Aufgaben zu großer Codeumfang mit vielen Abhängigkeiten zu externen Bibliotheken sowie eine hohe Komplexität. Dabei enthält die Standardbibliothek in net/http [1] doch bereits einen flexiblen Ansatz. Einfache Funktionen, flexible Typen und auch ein geschachteltes Multiplexing lassen sich zur Verarbeitung der Requests einsetzen.

Wer nun jedoch einen umfänglichen Ansatz wie in Rails erwartet, wird enttäuscht. Diesen Abstraktionsgrad bietet Go (zumindest von Haus aus) nicht. Besser ist hier der klassische Weg, Geschäftslogik und hierin genutzte Persistenz sauber über Interfaces zu definieren und diese zu nutzen. Neben den produktiven Implementierungen können so auch Stubs [2] für Tests elegant implementiert oder Datenbanksysteme ausgetauscht werden. Doch das ist ein anderes Thema.

Anfragen verarbeiten

Das Paket net/http bringt einen Server mit, der eintreffende HTTP Requests auf diese verarbeitenden Funktionen in Goroutinen verteilt. So sind die Funktionen http.ListenAndServe() für HTTP und http.ListenAndServeTLS() für HTTPS die einfachsten Varianten. Ebenso gibt es http.Serve() und http.ServeTLS(), die jeweils mit individuellen Instanzen eines net.Listener arbeiten und so mehr Flexibilität in dessen Konfiguration bieten. Der dritte Weg und derjenige mit der größten Flexibilität ist die Erzeugung einer eigenen Instanz des http.Server, die sich in vielen Parametern konfigurieren lässt.

Allen drei Varianten ist gemein, dass sie eine Implementierung des Interface http.Handler für die Verarbeitung der Requests benötigen. Diese Schnittstelle definiert nur die eine Methode ServeHTTP(w http.ResponseWriter, r *http.Request). In dieser Methode ist nun je nach Bedarf der Request r zu analysieren und eine Antwort an den Writer w zu schreiben. Beide Typen stellen hierfür unterschiedliche Felder und Methoden zur Verfügung.

Eine einfache und praktische Spielform des Interface ist http.HandlerFunc. Es ist der einfache Funktionstyp func(w http.ResponseWriter, r *http.Request), dessen Methode func (f HandlerFunc) ServeHTTP(w, r) als Aufruf ...

Exklusives Abo-Special

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang