Construire des API REST en Go : guide complet
Construisez des API REST prêtes pour la production grâce à l’écosystème robuste de Go
Construire des API REST haute performance avec Go est devenu une approche standard pour alimenter les systèmes chez Google, Uber, Dropbox et d’innombrables startups.
La simplicité de Go, son soutien solide de la concurrence et sa compilation rapide en font un choix idéal pour le développement de microservices et d’applications backend.
Cette superbe image est générée par FLUX.1-Kontext-dev: Image Augmentation AI Model.
Pourquoi Go pour le développement d’API ?
Go apporte plusieurs avantages convaincants au développement d’API :
Performance et Efficacité : Go se compile en code machine natif, offrant des performances proches de celles du C sans sa complexité. Sa gestion mémoire efficace et la petite taille de ses binaires en font un choix parfait pour les déploiements conteneurisés.
Concurrence intégrée : Les goroutines et les canaux rendent la gestion de milliers de requêtes concurrentes simple. Vous pouvez traiter plusieurs appels d’API simultanément sans un code de threading complexe.
Bibliothèque Standard Puissante : Le package net/http fournit un serveur HTTP prêt pour la production dès l’installation. Vous pouvez construire des API complètes sans aucune dépendance externe.
Compilation Rapide : La vitesse de compilation de Go permet des itérations rapides pendant le développement. Les grands projets se compilent en secondes, pas en minutes.
Typage Statique avec Simplicité : Le système de types de Go détecte les erreurs au moment de la compilation tout en préservant la clarté du code. Le langage a un jeu de fonctionnalités réduit, facile à apprendre.
Approches pour construire des API en Go
Utilisation de la Bibliothèque Standard
La bibliothèque standard de Go fournit tout ce qui est nécessaire pour le développement d’API basique. Voici un exemple minimal :
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 is healthy",
Status: 200,
})
}
func main() {
http.HandleFunc("/health", healthHandler)
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
Cette approche offre un contrôle total et zéro dépendance. Elle est idéale pour les API simples ou lorsque vous voulez comprendre le traitement HTTP à un niveau fondamental.
Frameworks Web Go Populaires
Bien que la bibliothèque standard soit puissante, les frameworks peuvent accélérer le développement :
Gin : Le framework web Go le plus populaire, connu pour ses performances et sa facilité d’utilisation. Il fournit un routage pratique, une prise en charge des middlewares et une validation des requêtes.
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 : Un routeur léger et idiomatique qui semble être une extension de la bibliothèque standard. Il est particulièrement bon pour construire des services RESTful avec un routage imbriqué.
Echo : Framework haute performance avec un middleware étendu et une excellente documentation. Il est optimisé pour la vitesse tout en restant convivial pour les développeurs.
Fiber : Inspiré d’Express.js, construit sur Fasthttp. C’est l’option la plus rapide, mais utilise une implémentation HTTP différente de la bibliothèque standard.
Pour les chiffres mesurés, les compromis de compatibilité de fasthttp et un tableau de décision entre les cinq stacks, consultez Frameworks Web Go en 2026 : net/http, chi, Gin, Echo, Fiber comparés.
Modèles d’Architecture
Lorsque vous travaillez avec des opérations de base de données en Go, vous devrez considérer votre stratégie d’ORM. Différents projets ont comparé des approches comme GORM, Ent, Bun et sqlc, chacun offrant des compromis différents entre la productivité des développeurs et les performances.
Architecture par Couches
Structurez votre API avec une séparation claire des préoccupations :
// Handler Layer - HTTP concerns
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 Layer - Business logic
type UserService struct {
repo *UserRepository
}
func (s *UserService) GetByID(ctx context.Context, id string) (*User, error) {
// Validate, transform, apply business rules
return s.repo.FindByID(ctx, id)
}
// Repository Layer - Data access
type UserRepository struct {
db *sql.DB
}
func (r *UserRepository) FindByID(ctx context.Context, id string) (*User, error) {
// Database query implementation
}
Cette séparation facilite les tests et maintient votre code maintenable à mesure que le projet grandit.
Conception Orientée Domaine
Pour les applications complexes, envisagez d’organiser le code par domaine plutôt que par couches techniques. Chaque package de domaine contient ses propres modèles, services et dépôts.
Si vous construisez des applications multi-locataires, comprendre les modèles de base de données pour la multi-locationalité devient crucial pour l’architecture de votre API.
Traitement des Requêtes et Validation
Validation des Entrées
Validez toujours les données entrantes avant traitement :
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("Invalid JSON"))
return
}
validate := validator.New()
if err := validate.Struct(req); err != nil {
respondError(w, NewValidationError(err))
return
}
// Process valid request
}
Le package go-playground/validator fournit des règles de validation étendues et des validateurs personnalisés.
Contexte de Requête
Utilisez le contexte pour les valeurs associées à la requête et l’annulation :
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))
})
}
Pour une plongée en profondeur dans les meilleures pratiques du contexte — y compris les clés typées, la propagation de l’annulation, les budgets d’expiration et l’arrêt progressif — consultez Le context.Context Go bien fait.
Authentification et Sécurité
Authentification Basée sur JWT
Les Jetons Web JSON (JWT) fournissent une authentification sans état :
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
}
Modèles de Middleware
Implémentez les préoccupations transversales sous forme de 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 requests/sec, burst of 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)
})
}
Gestion des Erreurs
Implémentez des réponses d’erreur cohérentes :
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 not found", resource),
}
}
func respondError(w http.ResponseWriter, err error) {
apiErr, ok := err.(*APIError)
if !ok {
apiErr = &APIError{
Code: http.StatusInternalServerError,
Message: "Internal server error",
}
// Log the actual error for debugging
log.Printf("Unexpected error: %v", err)
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(apiErr.Code)
json.NewEncoder(w).Encode(apiErr)
}
Pour un regard plus approfondi sur l’architecture des erreurs à travers les couches dépôt, service et handler — y compris les erreurs sentinelles, les types d’erreurs personnalisés, la traduction aux frontières et le mapping sécurisé des réponses — consultez Architecture de la Gestion des Erreurs en Go : Frontières et Modèles.
Intégration de Base de Données
Gestion des Connexions
Utilisez le pooling de connexions pour un accès efficace à la base de données :
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()
}
Modèles de Requêtes
Utilisez des requêtes préparées et le contexte pour des opérations de base de données sûres :
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
}
Stratégies de Test
Test des Handlers
Testez les handlers HTTP en utilisant httptest :
func TestGetUserHandler(t *testing.T) {
// Setup
mockService := &MockUserService{
GetByIDFunc: func(ctx context.Context, id string) (*User, error) {
return &User{ID: "1", Username: "testuser"}, nil
},
}
handler := &UserHandler{service: mockService}
// Execute
req := httptest.NewRequest("GET", "/users/1", nil)
w := httptest.NewRecorder()
handler.GetUser(w, req)
// Assert
assert.Equal(t, http.StatusOK, w.Code)
var response User
json.Unmarshal(w.Body.Bytes(), &response)
assert.Equal(t, "testuser", response.Username)
}
Tests d’Intégration
Testez les flux de travail complets avec une base de données de test :
func TestCreateUserEndToEnd(t *testing.T) {
// Setup test database
db := setupTestDB(t)
defer db.Close()
// Start test server
server := setupTestServer(db)
defer server.Close()
// Make request
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()
// Verify response
assert.Equal(t, http.StatusCreated, resp.StatusCode)
// Verify database state
var count int
db.QueryRow("SELECT COUNT(*) FROM users WHERE email = $1", "test@example.com").Scan(&count)
assert.Equal(t, 1, count)
}
Documentation d’API
OpenAPI/Swagger
Documentez votre API en utilisant les spécifications OpenAPI :
// @title User API
// @version 1.0
// @description API for managing users
// @host localhost:8080
// @BasePath /api/v1
// @Summary Get user by ID
// @Description Retrieves a user's information by their ID
// @Tags users
// @Accept json
// @Produce json
// @Param id path string true "User ID"
// @Success 200 {object} User
// @Failure 404 {object} APIError
// @Router /users/{id} [get]
func (h *UserHandler) GetUser(w http.ResponseWriter, r *http.Request) {
// Implementation
}
Utilisez swaggo/swag pour générer une documentation d’API interactive à partir de ces commentaires.
Optimisation des Performances
Compression des Réponses
Activez la compression gzip pour les réponses :
import "github.com/NYTimes/gziphandler"
func main() {
r := chi.NewRouter()
r.Use(gziphandler.GzipHandler)
// Rest of setup
}
Mise en Cache
Implémentez une mise en cache pour les données fréquemment accédées :
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) {
// Try cache first
cached, err := r.cache.Get(ctx, "user:"+id).Result()
if err == nil {
var user User
json.Unmarshal([]byte(cached), &user)
return &user, nil
}
// Cache miss - fetch from database
user, err := r.repo.FindByID(ctx, id)
if err != nil {
return nil, err
}
// Store in cache
data, _ := json.Marshal(user)
r.cache.Set(ctx, "user:"+id, data, 10*time.Minute)
return user, nil
}
Pooling de Connexions
Réutilisez les connexions HTTP pour les appels d’API externes :
var httpClient = &http.Client{
Timeout: 10 * time.Second,
Transport: &http.Transport{
MaxIdleConns: 100,
MaxIdleConnsPerHost: 10,
IdleConnTimeout: 90 * time.Second,
},
}
Considérations de Déploiement
Conteneurisation Docker
Créez des images Docker efficaces en utilisant des builds multi-stades :
# Build stage
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
# Production stage
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/api .
EXPOSE 8080
CMD ["./api"]
Cela produit une image minimale (généralement inférieure à 20 Mo) avec juste votre binaire et les certificats essentiels.
Gestion de la Configuration
Utilisez des variables d’environnement et des fichiers de configuration :
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
}
Arrêt Progressif (Graceful Shutdown)
Gérez correctement les signaux d’arrêt :
func main() {
server := &http.Server{
Addr: ":8080",
Handler: setupRouter(),
}
// Start server in goroutine
go func() {
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("Server error: %v", err)
}
}()
// Wait for interrupt signal
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutting down server...")
// Give outstanding requests 30 seconds to complete
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
log.Fatalf("Server forced to shutdown: %v", err)
}
log.Println("Server exited")
}
Supervision et Observabilité
Journalisation Structurée
Utilisez la journalisation structurée pour une meilleure recherche :
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("Processing request")
// Handler logic
}
Zap est un choix solide lorsque vous voulez un journaliseur tiers mature. Si vous préférez la bibliothèque standard, log/slog (Go 1.21+) offre des enregistrements compatibles JSON, une réfaction au niveau du handler et des champs alignés avec les traces et les pipelines de journaux. Consultez Journalisation Structurée en Go avec slog pour l’Observabilité et l’Alerte.
Collecte de Métriques
Exposez les métriques Prometheus :
import "github.com/prometheus/client_golang/prometheus"
var (
requestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Duration of HTTP requests",
},
[]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)
})
}
Modèles Avancés
Travail avec des Sorties Structurées
Lors de la construction d’API qui s’intègrent avec des LLM, vous pourriez avoir besoin de contraindre les réponses avec une sortie structurée. Cela est particulièrement utile pour les fonctionnalités alimentées par l’IA dans votre API.
Web Scraping pour les Sources de Données d’API
Si votre API doit agréger des données d’autres sites Web, comprendre les alternatives à Beautiful Soup en Go peut vous aider à implémenter une fonctionnalité de web scraping robuste.
Génération de Documents
De nombreuses API doivent générer des documents. Pour la génération de PDF en Go, il existe plusieurs bibliothèques et approches que vous pouvez intégrer dans vos points d’accès d’API.
Recherche Sémantique et Reranking
Pour les API qui traitent la recherche et la récupération de texte, l’implémentation du reranking avec des modèles d’embedding peut améliorer significativement la pertinence des résultats de recherche.
Construction de Serveurs MCP
Si vous implémentez des API qui suivent le Model Context Protocol, consultez ce guide sur l’implémentation de serveurs MCP en Go, qui couvre les spécifications du protocole et les implémentations pratiques.
Pièges Courants et Solutions
Non-utilisation Correcte des Contextes
Passez toujours et respectez le contexte à travers votre chaîne d’appels. Cela permet une annulation et une gestion des timeouts appropriées.
Ignorance des Fuites de Goroutines
Assurez-vous que toutes les goroutines peuvent se terminer. Utilisez des contextes avec des délais et ayez toujours un moyen de signaler l’achèvement.
Mauvaise Gestion des Erreurs
Ne renvoyez pas les erreurs brutes de la base de données aux clients. Enveloppez les erreurs avec du contexte et renvoyez des messages assainis dans les réponses d’API.
Absence de Validation des Entrées
Validez toutes les entrées au point d’entrée. Ne faites jamais confiance aux données du client, même en provenance d’utilisateurs authentifiés.
Tests Insuffisants
Ne testez pas seulement le chemin de succès. Couvrez les cas d’erreur, les conditions limites et les scénarios d’accès concurrent.
Résumé des Meilleures Pratiques
-
Commencez Simple : Commencez par la bibliothèque standard. Ajoutez des frameworks lorsque la complexité l’exige.
-
Structurez Votre Application par Couches : Séparez les handlers HTTP, la logique métier et l’accès aux données pour la maintenabilité.
-
Validez Tout : Vérifiez les entrées aux frontières. Utilisez un typage fort et des bibliothèques de validation.
-
Gérez les Erreurs Cohéremment : Renvoyez des réponses d’erreur structurées. Journalisez les erreurs internes mais ne les exposez pas.
-
Utilisez des Middleware : Implémentez les préoccupations transversales (auth, journalisation, métriques) sous forme de middleware.
-
Testez Thoroughly : Écrivez des tests unitaires pour la logique, des tests d’intégration pour l’accès aux données et des tests de bout en bout pour les flux de travail.
-
Documentez Votre API : Utilisez OpenAPI/Swagger pour une documentation interactive.
-
Supervisez la Production : Implémentez la journalisation structurée, la collecte de métriques et les contrôles de santé.
-
Optimisez avec Prudence : Profilez avant d’optimiser. Utilisez la mise en cache, le pooling de connexions et la compression lorsque c’est bénéfique.
-
Concevez pour un Arrêt Progressif : Gérez les signaux de terminaison et videz les connexions correctement.
Liste de Contrôle pour Commencer
Pour référence lors du travail sur des projets Go, avoir une fiche de triche Go complète à portée de main peut accélérer le développement et servir de référence rapide pour la syntaxe et les modèles courants.
Prêt à construire votre première API Go ? Commencez par ces étapes :
- ✅ Configurez votre environnement Go et la structure du projet
- ✅ Choisissez entre la bibliothèque standard ou un framework
- ✅ Implémentez des points d’accès CRUD basiques
- ✅ Ajoutez la validation des requêtes et la gestion des erreurs
- ✅ Implémentez le middleware d’authentification
- ✅ Ajoutez l’intégration de base de données avec pooling de connexions
- ✅ Écrivez des tests unitaires et d’intégration
- ✅ Ajoutez la documentation de l’API
- ✅ Implémentez la journalisation et les métriques
- ✅ Conteneurisez avec Docker
- ✅ Configurez le pipeline CI/CD
- ✅ Déployez en production avec supervision
Conclusion
Go fournit une excellente base pour construire des API REST, combinant performance, simplicité et un outiling robuste. Que vous construisiez des microservices, des outils internes ou des API publiques, l’écosystème Go a des solutions matures pour chaque exigence.
La clé du succès est de commencer par des modèles d’architecture solides, d’implémenter une gestion des erreurs et une validation appropriées dès le début, et de construire une couverture de tests complète. À mesure que votre API grandit, les caractéristiques de performance de Go et son soutien solide de la concurrence vous serviront bien.
Rappelez-vous que le développement d’API est itératif. Commencez par une implémentation minimale viable, recueillez des retours et affinez votre approche en fonction des modèles d’utilisation réels. La compilation rapide de Go et le refactorisation direct rendent ce cycle d’itération fluide et productif.
Liens Utiles
- Fiche de Triche Go
- Journalisation Structurée en Go avec slog pour l’Observabilité et l’Alerte
- Comparaison des ORM Go pour PostgreSQL : GORM vs Ent vs Bun vs sqlc
- Modèles de Base de Données Multi-Locataires avec des exemples en Go
- Alternatives à Beautiful Soup pour Go
- Génération de PDF en GO - Bibliothèques et exemples
- Contrainte des LLM avec une sortie structurée : Ollama, Qwen3 & Python ou Go
- Reranking de documents de texte avec Ollama et le modèle d’embedding Qwen3 - en Go
- Model Context Protocol (MCP), et notes sur l’implémentation de serveurs MCP en Go
Ressources Externes
Documentation Officielle
- Documentation Officielle Go - La documentation et les tutoriels officiels de Go
- Package net/http Go - Documentation du package HTTP de la bibliothèque standard
- Effective Go - Meilleures pratiques pour écrire un code Go clair et idiomatique
Frameworks et Bibliothèques Populaires
- Framework Web Gin - Framework web HTTP rapide avec des fonctionnalités étendues
- Routeur Chi - Routeur léger et idiomatique pour construire des services HTTP Go
- Framework Echo - Framework web haute performance, extensible et minimaliste
- Framework Fiber - Framework web inspiré d’Express construit sur Fasthttp
- GORM - La fantastique bibliothèque ORM pour Golang
- golang-jwt - Implémentation de JWT pour Go
Outils de Test et de Développement
- Testify - Un coffret d’outils avec des assertions courantes et des mocks
- Package httptest - Utilitaires de la bibliothèque standard pour les tests HTTP
- Swaggo - Génère automatiquement la documentation d’API RESTful
- Air - Rechargement en direct pour les applications Go pendant le développement
Meilleures Pratiques et Guides
- Disposition de Projet Go - Dispositions standard de projet Go
- Guide de Style Go d’Uber - Guide de style Go complet d’Uber
- Commentaires de Revue de Code Go - Commentaires courants effectués lors des revues de code Go
- Meilleures Pratiques de Conception d’API REST - Principes généraux de conception d’API REST
Sécurité et Authentification
- Pratiques de Codage Sûr Go d’OWASP - Lignes directrices de sécurité pour les applications Go
- OAuth2 pour Go - Implémentation OAuth 2.0
- Package bcrypt - Implémentation de hachage de mots de passe
Performance et Supervision
- pprof - Outil de profilage intégré pour les programmes Go
- Client Prometheus - Bibliothèque d’instrumentation Prometheus pour Go
- Journaliseur Zap - Journalisation rapide, structurée et nivelée
- Hub d’Architecture d’Applications — Conception d’API, structure du code et modèles d’intégration