Blog

Gorilla Mux - Ein Router und Dispatcher für Go

Dennis Vriend

Aktualisiert Oktober 21, 2025
2 Minuten

In meinem letzten Blog über die Programmiersprache Go haben wir gesehen, wie einfach es ist, mit ein paar Zeilen Go einen HTTP-Server zu erstellen. Dieses Mal werden wir uns Gorilla Mux (Mux) ansehen, einen vollwertigen Router und Dispatcher.

Einfacher HTTP-Server

Das Paket net/http bietet HTTP-Client- und -Server-Implementierungen. Wir können einen einfachen Server erstellen und mit HandlerFunc eine Funktion registrieren, die HTTP-Anfragen bearbeitet.

package main

import (
    "io"
    "net/http"
)

func IndexHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "Hello, world!n")
}

func main() {
    http.HandleFunc("/", IndexHandler)
    http.ListenAndServe(":8080", nil)
}

Mux

Mux bietet die gleiche Router/Dispatcher-Funktion wie 'http.Handlefunc', indem es eingehende Anfragen mit einer Liste registrierter Routen abgleicht und die Handler-Funktion aufruft.

package main

import (
    "github.com/gorilla/mux"
    "io"
    "net/http"
)

func IndexHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "Hello, Mux!n")
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", IndexHandler)
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

Mux-Anpassung

Mux verfügt über eine umfangreichere Matcher-Engine als Go standardmäßig bietet. Mux kann auch Anfragen auf der Grundlage von URL-Host, Pfad, Pfadpräfix, Schemata, Header- und Abfragewerten, HTTP-Methoden abgleichen oder Sie können Ihren eigenen benutzerdefinierten Matcher schreiben. Die Pfade können Variablen und Regex-Ausdrücke für die Übereinstimmung enthalten.

package main

import (
    "encoding/json"
    "github.com/gorilla/mux"
    "io"
    "log"
    "net/http"
    "strconv"
)

type Cat struct {
    ID int json:"id"
    Name string json:"name"
    Age int json:"age"
}

var cats = []Cat {
    Cat { ID: 1, Name:"Elsa", Age: 16 },
    Cat { ID: 2, Name:"Tijger", Age: 12 },
}

func IndexHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "Hello, Mux!n")
}

func CatsHandler(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(cats)
}

func CatHandler(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    params := mux.Vars(req)
    id, _ := strconv.Atoi(params["id"])
    for _, cat := range cats {
        if cat.ID == id {
            json.NewEncoder(w).Encode(cat)
            return
        }
    }
    w.WriteHeader(http.StatusNotFound)
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", IndexHandler).Methods("GET")
    r.HandleFunc("/cats", CatsHandler).Methods("GET")
    r.HandleFunc("/cats/{id:[0-9]+}", CatHandler).Methods("GET")
    http.Handle("/", r)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Fazit

Die Go-Standardbibliothek bietet HTTP-Server-Implementierungen mit grundlegenden Router-/Dispatcher-Funktionen. Meistens benötigen Sie eine umfangreichere Abgleichsfunktion und Gorilla Mux bietet eine solche. Es kann Anfragen auf der Grundlage von URL-Host, Pfad, Pfadpräfix, Schemata, Header- und Abfragewerten, HTTP-Methoden und sogar auf Regex abgleichen. Das nächste Mal werden wir Mux in einem Google App Engine Beispiel verwenden.


Tags:

Verfasst von

Dennis Vriend

Contact

Let’s discuss how we can support your journey.