Einleitung: Warum Go ideal für REST APIs ist
Go (oder Golang) ist eine moderne, kompilierte Programmiersprache, die bei Google entwickelt wurde. Sie vereint die Leistung von C++ mit der Einfachheit von Python, was sie zur idealen Wahl für die Erstellung hochbelastbarer Webdienste und REST APIs macht. Im Gegensatz zu vielen anderen Sprachen bietet Go integrierte Unterstützung für HTTP-Server, Multithreading und schnelle Kompilierung.
In dieser Anleitung erstellen wir Schritt für Schritt eine vollwertige REST API zur Verwaltung einer Aufgabenliste (Todo List). Sie lernen:
- Einen HTTP-Server in Go einzurichten
- Mit JSON-Anfragen und -Antworten zu arbeiten
- CRUD-Operationen (Create, Read, Update, Delete) zu implementieren
- Die API mit curl oder Postman zu testen
Der gesamte Vorgang dauert nicht länger als 30 Minuten. Los geht's!
1. Installation und Projekteinrichtung
Bevor wir Code schreiben, stellen Sie sicher, dass Go installiert ist. Überprüfen können Sie dies mit dem Befehl:
go versionWenn Go nicht installiert ist, laden Sie die neueste Version von der offiziellen Website herunter.
Erstellen Sie ein neues Verzeichnis für das Projekt und initialisieren Sie das Modul:
mkdir go-rest-apicd go-rest-apigo mod init go-rest-apiErstellen Sie nun die Datei main.go – darin wird der gesamte Code stehen. Für die Routenverwaltung verwenden wir die Standardbibliothek net/http, die bereits in Go integriert ist. Es sind keine externen Abhängigkeiten erforderlich – das ist einer der Hauptvorteile der Sprache.
2. Datenstruktur und Speicher definieren
Beginnen wir mit der Beschreibung des Datenmodells. Der Einfachheit halber speichern wir Aufgaben im Arbeitsspeicher (in einem Slice) und nicht in einer Datenbank. Erstellen wir die Struktur Task und einen globalen ID-Zähler:
package main
import ( "encoding/json" "log" "net/http" "strconv" "strings" "sync")
// Task repräsentiert eine Aufgabetype Task struct { ID int `json:"id"` Title string `json:"title"` Done bool `json:"done"`}
// Aufgabenspeicher (im Arbeitsspeicher)var ( tasks []Task nextID int = 1 mu sync.Mutex)Beachten Sie sync.Mutex – es wird für den threadsicheren Zugriff auf die Daten benötigt, da der Go-Server Anfragen parallel verarbeiten kann.
3. Implementierung der CRUD-Operationen
Jetzt schreiben wir die wichtigsten Handler für jede HTTP-Methode. Wir verwenden das URL-Routing-Muster:
GET /tasks– alle Aufgaben abrufenPOST /tasks– eine neue Aufgabe erstellenGET /tasks/{id}– eine Aufgabe nach ID abrufenPUT /tasks/{id}– eine Aufgabe aktualisierenDELETE /tasks/{id}– eine Aufgabe löschen
3.1. Alle Aufgaben abrufen (GET /tasks)
func getTasks(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock()
w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(tasks)}3.2. Aufgabe erstellen (POST /tasks)
func createTask(w http.ResponseWriter, r *http.Request) { var newTask Task if err := json.NewDecoder(r.Body).Decode(&newTask); err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return }
mu.Lock() newTask.ID = nextID nextID++ tasks = append(tasks, newTask) mu.Unlock()
w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newTask)}3.3. Abrufen, Aktualisieren und Löschen nach ID
Für diese Operationen müssen wir die ID aus der URL extrahieren. Die Go-Standardbibliothek hat keinen integrierten Pfadparser, daher schreiben wir ein einfaches Hilfsprogramm: