REST-APIs in Go erstellen: Komplettführer
Erstellen Sie produktionsbereite REST-APIs mit dem robusten Ökosystem von Go
Der Aufbau von leistungsstarken REST-APIs mit Go ist zu einem Standardansatz für die Bereitstellung von Systemen bei Google, Uber, Dropbox und unzähligen Startups geworden.
Die Einfachheit von Go, die starke Unterstützung für Concurrency und die schnelle Kompilierung machen es ideal für Mikrodienste und Backend-Entwicklung.
Dieses tolle Bild wurde von FLUX.1-Kontext-dev: Image Augmentation AI Model generiert.
Warum Go für die API-Entwicklung?
Go bringt mehrere überzeugende Vorteile für die API-Entwicklung mit:
Leistung und Effizienz: Go kompiliert zu nativem Maschinencode und liefert nahezu C-Leistung ohne Komplexität. Seine effiziente Speicherverwaltung und kleinen Binärgrößen machen es perfekt für containerisierte Bereitstellungen.
Eingebaute Concurrency: Goroutines und Kanäle machen die Verarbeitung von tausenden gleichzeitigen Anfragen einfach. Sie können mehrere API-Aufrufe gleichzeitig verarbeiten, ohne komplexen Threading-Code.
Starke Standardbibliothek: Das net/http-Paket bietet einen produktionsbereiten HTTP-Server direkt aus der Box. Sie können vollständige APIs ohne externe Abhängigkeiten erstellen.
Schnelle Kompilierung: Die Kompilierungsgeschwindigkeit von Go ermöglicht schnelle Iterationen während der Entwicklung. Große Projekte kompilieren in Sekunden, nicht in Minuten.
Statische Typisierung mit Einfachheit: Das Typsystem von Go fängt Fehler zur Kompilierungszeit auf, während es die Code-Klarheit erhält. Die Sprache hat einen kleinen Funktionsumfang, der schnell erlernbar ist.
Ansätze zum Aufbau von APIs in Go
Verwendung der Standardbibliothek
Die Standardbibliothek von Go bietet alles, was für die grundlegende API-Entwicklung benötigt wird. Hier ist ein minimales Beispiel:
package main
import (
"encoding/json"
"log"
"net/http"
)
type Response struct {
Message string `json:"message"`
Status int `json:"status"`
}
func healthHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(Response{
Message: "API ist gesund",
Status: 200,
})
}
func main() {
http.HandleFunc("/health", healthHandler)
log.Println("Server startet auf :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
Dieser Ansatz bietet vollständige Kontrolle und null Abhängigkeiten. Er ist ideal für einfache APIs oder wenn Sie HTTP-Handling auf fundamentaler Ebene verstehen wollen.
Beliebte Go-Web-Frameworks
Während die Standardbibliothek leistungsfähig ist, können Frameworks die Entwicklung beschleunigen:
Gin: Das beliebteste Go-Web-Framework, bekannt für seine Leistung und Benutzerfreundlichkeit. Es bietet bequeme Routing, Middleware-Unterstützung und Anfragevalidierung.
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.JSON(http.StatusOK, gin.H{
"user_id": id,
"name": "John Doe",
})
})
r.Run(":8080")
}
Chi: Ein leichtgewichtiger, idiomatischer Router, der sich wie eine Erweiterung der Standardbibliothek anfühlt. Er ist besonders gut für den Aufbau von RESTful-Diensten mit verschachteltem Routing.
Echo: Hochleistungs-Framework mit umfangreicher Middleware und exzellenter Dokumentation. Es ist für Geschwindigkeit optimiert, bleibt aber benutzerfreundlich.
Fiber: Inspiriert von Express.js, aufgebaut auf Fasthttp. Es ist die schnellste Option, verwendet aber eine andere HTTP-Implementierung als die Standardbibliothek.
Architektur-Muster
Bei der Arbeit mit Datenbankoperationen in Go müssen Sie Ihre ORM-Strategie berücksichtigen. Verschiedene Projekte haben Ansätze wie GORM, Ent, Bun und sqlc verglichen, die jeweils unterschiedliche Kompromisse zwischen Entwicklerproduktivität und Leistung bieten.
Schichtarchitektur
Strukturieren Sie Ihre API mit klarer Trennung der Verantwortlichkeiten:
// Handler-Schicht - HTTP-Anliegen
type UserHandler struct {
service *UserService
}
func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
id := chi.URLParam(r, "id")
user, err := h.service.GetByID(r.Context(), id)
if err != nil {
respondError(w, err)
return
}
respondJSON(w, user)
}
// Service-Schicht - Geschäftslogik
type UserService struct {
repo *UserRepository
}
func (s *UserService) GetByID(ctx context.Context, id string) (*User, error) {
// Validierung, Transformation, Anwendung von Geschäftsregeln
return s.repo.FindByID(ctx, id)
}
// Repository-Schicht - Datenzugriff
type UserRepository struct {
db *sql.DB
}
func (r *UserRepository) FindByID(ctx context.Context, id string) (*User, error) {
// Implementierung der Datenbankabfrage
}
Diese Trennung macht das Testen einfacher und hält Ihren Code wartbar, wenn das Projekt wächst.
Domain-Driven Design
Für komplexe Anwendungen sollten Sie die Code-Organisation nach Domänen statt nach technischen Schichten in Betracht ziehen. Jedes Domain-Paket enthält seine eigenen Modelle, Dienste und Repositories.
Wenn Sie Multi-Tenant-Anwendungen erstellen, wird das Verständnis von Datenbankmustern für Multi-Tenancy für Ihre API-Architektur entscheidend.
Anfrageverarbeitung und Validierung
Eingabedaten-Validierung
Validieren Sie immer eingehende Daten, bevor Sie sie verarbeiten:
type CreateUserRequest struct {
Email string `json:"email" validate:"required,email"`
Username string `json:"username" validate:"required,min=3,max=50"`
Age int `json:"age" validate:"gte=0,lte=150"`
}
func (h *UserHandler) CreateUser(w http.ResponseWriter, r *http.Request) {
var req CreateUserRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
respondError(w, NewBadRequestError("Ungültiges JSON"))
return
}
validate := validator.New()
if err := validate.Struct(req); err != nil {
respondError(w, NewValidationError(err))
return
}
// Verarbeitung der gültigen Anfrage
}
Das Paket go-playground/validator bietet umfangreiche Validierungsregeln und benutzerdefinierte Validatoren.
Anfragekontext
Verwenden Sie Kontext für anfragebezogene Werte und Abbruch:
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
userID, err := validateToken(token)
if err != nil {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
ctx := context.WithValue(r.Context(), "userID", userID)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
Authentifizierung und Sicherheit
JWT-basierte Authentifizierung
JSON Web Tokens bieten stateless Authentifizierung:
import "github.com/golang-jwt/jwt/v5"
func generateToken(userID string) (string, error) {
claims := jwt.MapClaims{
"user_id": userID,
"exp": time.Now().Add(time.Hour * 24).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(os.Getenv("JWT_SECRET")))
}
func validateToken(tokenString string) (string, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte(os.Getenv("JWT_SECRET")), nil
})
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
return claims["user_id"].(string), nil
}
return "", err
}
Middleware-Muster
Implementieren Sie querschnittliche Anliegen als Middleware:
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
log.Printf("Started %s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
log.Printf("Completed in %v", time.Since(start))
})
}
func rateLimitMiddleware(next http.Handler) http.Handler {
limiter := rate.NewLimiter(10, 20) // 10 Anfragen/Sekunde, Burst von 20
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !limiter.Allow() {
http.Error(w, "Rate limit exceeded", http.StatusTooManyRequests)
return
}
next.ServeHTTP(w, r)
})
}
Fehlerbehandlung
Implementieren Sie konsistente Fehlerantworten:
type APIError struct {
Code int `json:"code"`
Message string `json:"message"`
Details string `json:"details,omitempty"`
}
func (e *APIError) Error() string {
return e.Message
}
func NewBadRequestError(message string) *APIError {
return &APIError{
Code: http.StatusBadRequest,
Message: message,
}
}
func NewNotFoundError(resource string) *APIError {
return &APIError{
Code: http.StatusNotFound,
Message: fmt.Sprintf("%s nicht gefunden", resource),
}
}
func respondError(w http.ResponseWriter, err error) {
apiErr, ok := err.(*APIError)
if !ok {
apiErr = &APIError{
Code: http.StatusInternalServerError,
Message: "Interner Serverfehler",
}
// Loggen des tatsächlichen Fehlers zur Debugging
log.Printf("Unerwarteter Fehler: %v", err)
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(apiErr.Code)
json.NewEncoder(w).Encode(apiErr)
}
Datenbankintegration
Verbindungsverwaltung
Verwenden Sie Connection-Pooling für effizienten Datenbankzugriff:
func initDB() (*sql.DB, error) {
db, err := sql.Open("postgres", os.Getenv("DATABASE_URL"))
if err != nil {
return nil, err
}
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)
return db, db.Ping()
}
Abfrage-Muster
Verwenden Sie vorbereitete Anweisungen und Kontext für sichere Datenbankoperationen:
func (r *UserRepository) FindByEmail(ctx context.Context, email string) (*User, error) {
query := `SELECT id, email, username, created_at FROM users WHERE email = $1`
var user User
err := r.db.QueryRowContext(ctx, query, email).Scan(
&user.ID,
&user.Email,
&user.Username,
&user.CreatedAt,
)
if err == sql.ErrNoRows {
return nil, ErrUserNotFound
}
return &user, err
}
Teststrategien
Handler-Tests
Testen Sie HTTP-Handler mit httptest:
func TestGetUserHandler(t *testing.T) {
// Einrichtung
mockService := &MockUserService{
GetByIDFunc: func(ctx context.Context, id string) (*User, error) {
return &User{ID: "1", Username: "testuser"}, nil
},
}
handler := &UserHandler{service: mockService}
// Ausführung
req := httptest.NewRequest("GET", "/users/1", nil)
w := httptest.NewRecorder()
handler.GetUser(w, req)
// Überprüfung
assert.Equal(t, http.StatusOK, w.Code)
var response User
json.Unmarshal(w.Body.Bytes(), &response)
assert.Equal(t, "testuser", response.Username)
}
Integrationstests
Testen Sie vollständige Arbeitsabläufe mit einer Testdatenbank:
func TestCreateUserEndToEnd(t *testing.T) {
// Testdatenbank einrichten
db := setupTestDB(t)
defer db.Close()
// Testserver starten
server := setupTestServer(db)
defer server.Close()
// Anfrage senden
body := strings.NewReader(`{"email":"test@example.com","username":"testuser"}`)
resp, err := http.Post(server.URL+"/users", "application/json", body)
require.NoError(t, err)
defer resp.Body.Close()
// Antwort überprüfen
assert.Equal(t, http.StatusCreated, resp.StatusCode)
// Datenbankzustand überprüfen
var count int
db.QueryRow("SELECT COUNT(*) FROM users WHERE email = $1", "test@example.com").Scan(&count)
assert.Equal(t, 1, count)
}
API-Dokumentation
OpenAPI/Swagger
Dokumentieren Sie Ihre API mit OpenAPI-Spezifikationen:
// @title User API
// @version 1.0
// @description API für das Benutzerverwaltung
// @host localhost:8080
// @BasePath /api/v1
// @Summary Benutzer nach ID abrufen
// @Description Holt die Informationen eines Benutzers anhand seiner ID
// @Tags users
// @Accept json
// @Produce json
// @Param id path string true "Benutzer-ID"
// @Success 200 {object} User
// @Failure 404 {object} APIError
// @Router /users/{id} [get]
func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
// Implementierung
}
Verwenden Sie swaggo/swag, um interaktive API-Dokumentation aus diesen Kommentaren zu generieren.
Leistungsoptimierung
Antwortkomprimierung
Aktivieren Sie gzip-Komprimierung für Antworten:
import "github.com/NYTimes/gziphandler"
func main() {
r := chi.NewRouter()
r.Use(gziphandler.GzipHandler)
// Rest der Einrichtung
}
Caching
Implementieren Sie Caching für häufig abgerufene Daten:
import "github.com/go-redis/redis/v8"
type CachedUserRepository struct {
repo *UserRepository
cache *redis.Client
}
func (r *CachedUserRepository) GetByID(ctx context.Context, id string) (*User, error) {
// Zuerst Cache prüfen
cached, err := r.cache.Get(ctx, "user:"+id).Result()
if err == nil {
var user User
json.Unmarshal([]byte(cached), &user)
return &user, nil
}
// Cache-Fehltreffer - aus Datenbank holen
user, err := r.repo.FindByID(ctx, id)
if err != nil {
return nil, err
}
// Im Cache speichern
data, _ := json.Marshal(user)
r.cache.Set(ctx, "user:"+id, data, 10*time.Minute)
return user, nil
}
Verbindungspooling
Reuse HTTP-Verbindungen für externe API-Aufrufe:
var httpClient = &http.Client{
Timeout: 10 * time.Second,
Transport: &http.Transport{
MaxIdleConns: 100,
MaxIdleConnsPerHost: 10,
IdleConnTimeout: 90 * time.Second,
},
}
Bereitstellungsüberlegungen
Docker-Containerisierung
Erstellen Sie effiziente Docker-Images mit mehrstufigen Builds:
# Build-Stufe
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o api ./cmd/api
# Produktionsstufe
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/api .
EXPOSE 8080
CMD ["./api"]
Dies erzeugt ein minimales Image (typischerweise unter 20MB) mit nur Ihrer Binärdatei und den wesentlichen Zertifikaten.
Konfigurationsmanagement
Verwenden Sie Umgebungsvariablen und Konfigurationsdateien:
type Config struct {
Port string
DatabaseURL string
JWTSecret string
LogLevel string
}
func LoadConfig() (*Config, error) {
return &Config{
Port: getEnv("PORT", "8080"),
DatabaseURL: getEnv("DATABASE_URL", ""),
JWTSecret: getEnv("JWT_SECRET", ""),
LogLevel: getEnv("LOG_LEVEL", "info"),
}, nil
}
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
Anmutendes Herunterfahren
Behandeln Sie Herunterfahrsignale richtig:
func main() {
server := &http.Server{
Addr: ":8080",
Handler: setupRouter(),
}
// Server in Goroutine starten
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Server-Fehler: %v", err)
}
}
// Auf Interrupt-Signal warten
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Server wird heruntergefahren...")
// Ausstehenden Anfragen 30 Sekunden Zeit zum Abschließen geben
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Fatalf("Server wurde zum Herunterfahren gezwungen: %v", err)
}
log.Println("Server beendet")
}
Überwachung und Beobachtbarkeit
Strukturierte Protokollierung
Verwenden Sie strukturierte Protokollierung für bessere Suchbarkeit:
import "go.uber.org/zap"
func setupLogger() (*zap.Logger, error) {
config := zap.NewProductionConfig()
config.OutputPaths = []string{"stdout"}
return config.Build()
}
func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
logger := h.logger.With(
zap.String("method", r.Method),
zap.String("path", r.URL.Path),
zap.String("user_id", r.Context().Value("userID").(string)),
)
logger.Info("Verarbeite Anfrage")
// Handler-Logik
}
Metriken-Sammlung
Exponieren Sie Prometheus-Metriken:
import "github.com/prometheus/client_golang/prometheus"
var (
requestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Dauer der HTTP-Anfragen",
},
[]string{"method", "path", "status"},
)
)
func init() {
prometheus.MustRegister(requestDuration)
}
func metricsMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
recorder := &statusRecorder{ResponseWriter: w, status: 200}
next.ServeHTTP(recorder, r)
duration := time.Since(start).Seconds()
requestDuration.WithLabelValues(
r.Method,
r.URL.Path,
strconv.Itoa(recorder.status),
).Observe(duration)
})
}
Fortgeschrittene Muster
Arbeiten mit strukturierten Ausgaben
Bei der Erstellung von APIs, die mit LLMs integriert werden, müssen Sie möglicherweise Antworten mit strukturierten Ausgaben einschränken. Dies ist besonders nützlich für KI-gestützte Funktionen in Ihrer API.
Web-Scraping für API-Datenquellen
Wenn Ihre API Daten von anderen Websites aggregieren muss, kann das Verständnis Alternativen zu Beautiful Soup in Go Ihnen helfen, robuste Web-Scraping-Funktionalitäten zu implementieren.
Dokumentenerstellung
Viele APIs müssen Dokumente generieren. Für die PDF-Erstellung in Go gibt es mehrere Bibliotheken und Ansätze, die Sie in Ihre API-Endpunkte integrieren können.
Semantische Suche und Neurangierung
Für APIs, die mit Textsuche und -abruf arbeiten, kann die Implementierung Neurangierung mit Embedding-Modellen die Relevanz der Suchergebnisse deutlich verbessern.
Aufbau von MCP-Servern
Wenn Sie APIs implementieren, die dem Model Context Protocol folgen, sehen Sie sich diese Anleitung zum Implementieren von MCP-Servern in Go an, die Protokollspezifikationen und praktische Implementierungen abdeckt.
Häufige Fallstricke und Lösungen
Nicht korrekte Verwendung von Contexts
Geben Sie Contexts immer weiter und respektieren Sie diese in Ihrer Aufrufkette. Dies ermöglicht eine ordnungsgemäße Abbruch- und Timeout-Handhabung.
Vergessen von Goroutine-Leaks
Stellen Sie sicher, dass alle Goroutines beendet werden können. Verwenden Sie Contexts mit Fristen und haben Sie immer eine Möglichkeit, den Abschluss zu signalisieren.
Schlechte Fehlerbehandlung
Geben Sie keine Rohdatenbankfehler an Clients zurück. Wrappen Sie Fehler mit Kontext und geben Sie gesäuberte Nachrichten in API-Antworten zurück.
Fehlende Eingabeverifikation
Überprüfen Sie alle Eingaben am Einstiegspunkt. Vertrauen Sie niemals Client-Daten, nicht einmal von authentifizierten Benutzern.
Unzureichendes Testen
Testen Sie nicht nur den Happy Path. Decken Sie Fehlerfälle, Randbedingungen und Szenarien mit gleichzeitigem Zugriff ab.
Best Practices Zusammenfassung
-
Einfach anfangen: Beginnen Sie mit der Standardbibliothek. Fügen Sie Frameworks hinzu, wenn die Komplexität dies erfordert.
-
Schichten Sie Ihre Anwendung: Trennen Sie HTTP-Handler, Geschäftslogik und Datenzugriff für die Wartbarkeit.
-
Validieren Sie alles: Überprüfen Sie Eingaben an Grenzen. Verwenden Sie starke Typisierung und Validierungsbibliotheken.
-
Behandeln Sie Fehler konsistent: Geben Sie strukturierte Fehlerantworten zurück. Protokollieren Sie interne Fehler, aber geben Sie sie nicht preis.
-
Verwenden Sie Middleware: Implementieren Sie querschnittliche Themen (Auth, Logging, Metriken) als Middleware.
-
Testen Sie gründlich: Schreiben Sie Unit-Tests für die Logik, Integrationstests für den Datenzugriff und End-to-End-Tests für Arbeitsabläufe.
-
Dokumentieren Sie Ihre API: Verwenden Sie OpenAPI/Swagger für interaktive Dokumentation.
-
Überwachen Sie die Produktion: Implementieren Sie strukturierte Protokollierung, Metriken-Sammlung und Gesundheitsüberprüfungen.
-
Optimieren Sie sorgfältig: Profilieren Sie vor der Optimierung. Verwenden Sie Caching, Verbindungspooling und Komprimierung, wo es sinnvoll ist.
-
Entwerfen Sie für anmutendes Herunterfahren: Behandeln Sie Terminationssignale und leeren Sie Verbindungen ordnungsgemäß.
Checkliste für den Einstieg
Für die Arbeit an Go-Projekten kann ein umfassender Go-Cheat-Sheet als schnelle Referenz für Syntax und gängige Muster nützlich sein.
Bereit, Ihre erste Go-API zu erstellen? Beginnen Sie mit diesen Schritten:
- ✅ Einrichtung Ihrer Go-Umgebung und Projektstruktur
- ✅ Wahl zwischen Standardbibliothek oder Framework
- ✅ Implementierung grundlegender CRUD-Endpunkte
- ✅ Hinzufügen von Anforderungsvalidierung und Fehlerbehandlung
- ✅ Implementierung von Authentifizierungs-Middleware
- ✅ Datenbankintegration mit Connection-Pooling
- ✅ Schreiben von Unit- und Integrationstests
- ✅ Hinzufügen von API-Dokumentation
- ✅ Implementierung von Logging und Metriken
- ✅ Containerisierung mit Docker
- ✅ Einrichtung einer CI/CD-Pipeline
- ✅ Bereitstellung für die Produktion mit Überwachung
Fazit
Go bietet eine hervorragende Grundlage für den Aufbau von REST-APIs, kombiniert mit Leistung, Einfachheit und robusten Tools. Ob Sie Mikrodienste, interne Tools oder öffentliche APIs erstellen, das Go-Ökosystem bietet ausgereifte Lösungen für jeden Anforderungen.
Der Schlüssel zum Erfolg liegt darin, mit soliden architektonischen Mustern zu beginnen, eine ordnungsgemäße Fehlerbehandlung und Validierung von Anfang an zu implementieren und eine umfassende Testabdeckung aufzubauen. Wenn Ihre API wächst, werden die Leistungseigenschaften von Go und die starke Unterstützung für Concurrency Ihnen gut dienen.
Denken Sie daran, dass die API-Entwicklung iterativ ist. Beginnen Sie mit einer minimalen funktionsfähigen Implementierung, sammeln Sie Feedback und verfeinern Sie Ihren Ansatz basierend auf realen Nutzungsmustern. Die schnelle Kompilierung von Go und die einfache Refaktorierung machen diesen Iterationszyklus reibungslos und produktiv.
Nützliche Links
- Go Cheat Sheet
- Vergleich von Go ORMs für PostgreSQL: GORM vs Ent vs Bun vs sqlc
- Multi-Tenancy-Datenbankmuster mit Beispielen in Go
- Alternativen zu Beautiful Soup für Go
- PDF-Generierung in GO - Bibliotheken und Beispiele
- LLMs mit strukturierter Ausgabe einschränken: Ollama, Qwen3 & Python oder Go
- Textdokumente mit Ollama und Qwen3 Embedding-Modell neu rangieren - in Go
- Model Context Protocol (MCP) und Hinweise zur Implementierung eines MCP-Servers in Go
Externe Ressourcen
Offizielle Dokumentation
- Go Offizielle Dokumentation - Die offizielle Go-Dokumentation und Tutorials
- Go net/http-Paket - Dokumentation des Standardbibliothek-HTTP-Pakets
- Effektives Go - Best Practices für das Schreiben von klaren, idiomatischen Go-Code
Beliebte Frameworks und Bibliotheken
- Gin Web Framework - Schnelles HTTP-Web-Framework mit umfangreichen Funktionen
- Chi Router - Leichtgewichtiger, idiomatischer Router zum Erstellen von Go-HTTP-Diensten
- Echo Framework - Hochleistungsfähiges, erweiterbares, minimalistisches Web-Framework
- Fiber Framework - Express-inspiriertes Web-Framework, das auf Fasthttp aufgebaut ist
- GORM - Die fantastische ORM-Bibliothek für Golang
- golang-jwt - JWT-Implementierung für Go
Test- und Entwicklungstools
- Testify - Ein Toolkit mit häufigen Assertions und Mocks
- httptest-Paket - Standardbibliothek-Utilities für HTTP-Tests
- Swaggo - Automatische Generierung von RESTful API-Dokumentation
- Air - Live-Reload für Go-Apps während der Entwicklung
Best Practices und Leitfäden
- Go Project Layout - Standard-Go-Projektlayouts
- Uber Go Style Guide - Umfassender Go-Stil-Leitfaden von Uber
- Go Code Review Comments - Häufige Kommentare, die während Go-Code-Reviews gemacht werden
- REST API Design Best Practices - Allgemeine REST API-Designprinzipien
Sicherheit und Authentifizierung
- OWASP Go Secure Coding Practices - Sicherheitsrichtlinien für Go-Anwendungen
- OAuth2 für Go - OAuth 2.0-Implementierung
- bcrypt-Paket - Passwort-Hashing-Implementierung
Leistung und Überwachung
- pprof - Eingebautes Profiling-Tool für Go-Programme
- Prometheus Client - Prometheus-Instrumentierungsbibliothek für Go
- Zap Logger - Schnelles, strukturiertes, niveaubasiertes Logging