⚡ AutoSnippets PRO EN

Go: Produkcyjne Snippet'y Kodu

Snippet'y Go: serwery HTTP, worker poole, rate limiting, konfiguracja baz danych.

Python JavaScript TypeScript Java C# C++ Go PHP Rust SQL

Na tej stronie:

31. Go: Serwer HTTP z Graceful Shutdown

Go

Obsługa żądań z propagacją context.Context i bezpiecznym zamykaniem.

package main

import (
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("OK"))
    })
    http.ListenAndServe(":8080", mux)
}

Kiedy używać

Podstawa każdej usługi HTTP w Go — punkt startowy do budowy API czy mikroserwisu.

Typowe pułapki

Ten przykład nie obsługuje faktycznego graceful shutdown (przechwycenia sygnału SIGTERM) — w produkcji trzeba dodać obsługę sygnałów i http.Server.Shutdown().

32. Go: Worker Pool oparci o Kanały

Go

Dystrybucja zadań do stałej liczby workerów współbieżnych.

package main

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        results <- j * 2
    }
}

func startPool() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }
}

Kiedy używać

Stosuj, gdy masz dużo niezależnych zadań i chcesz kontrolować liczbę równoległych workerów zamiast odpalać goroutine bez ograniczeń.

Typowe pułapki

Kanał results musi być odczytywany, inaczej workery zablokują się przy próbie zapisu, gdy bufor się zapełni (tzw. deadlock).

33. Go: Token Bucket Rate Limiter

Go

Implementacja algorytmu przepustowości ruchu sieciowego.

package main

import "golang.org/x/time/rate"

var limiter = rate.NewLimiter(1, 5)

func checkLimit() bool {
    return limiter.Allow()
}

Kiedy używać

Przydatne do ograniczania częstotliwości wywołań zewnętrznego API lub własnych endpointów.

Typowe pułapki

Limiter zdefiniowany jako zmienna globalna współdzieli stan między wszystkimi żądaniami — przy limitach per-użytkownik potrzebna jest osobna instancja dla każdego klienta.

34. Go: Middleware Uwierzytelniania

Go

Sprawdzanie tokenów i wstrzykiwanie danych sesji do kontekstu.

package main

import "net/http"

func AuthMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if token != "Bearer secret" {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    })
}

Kiedy używać

Podstawowy wzorzec ochrony endpointów przed nieautoryzowanym dostępem w prostych API.

Typowe pułapki

Porównywanie tokenów przez zwykłe == jest podatne na timing attacks — w produkcji użyj funkcji stałoczasowego porównania, np. subtle.ConstantTimeCompare.

35. Go: Konfiguracja Poolu Połączeń SQL

Go

Konfiguracja optymalnych limitów połączeń bazodanowych.

package main

import (
    "database/sql"
    "time"
)

func configurePool(db *sql.DB) {
    db.SetMaxOpenConns(25)
    db.SetMaxIdleConns(5)
    db.SetConnMaxLifetime(5 * time.Minute)
}

Kiedy używać

Warto ustawić przy każdym połączeniu z bazą danych — domyślne wartości Go bywają zbyt liberalne dla produkcyjnego obciążenia.

Typowe pułapki

Zbyt wysoki SetMaxOpenConns może przeciążyć bazę danych przy skoku ruchu — wartość powinna być dopasowana do limitów samej bazy.