Go (Gin) — Bonnes Pratiques
Contexte IA & Optimisation des Tokens
- Gestion explicite des erreurs : Ne jamais
panic. Retourner toujours les erreurs explicitement (%w). Cela crée une piste de débogage traçable pour les outils de débogage IA.
- Isolation des interfaces : Définir des interfaces de petite taille au niveau du consommateur (ex.
UserRepository). Cela rend les tests unitaires et le mocking pilotés par IA très fiables.
- Gestionnaires plats : Maintenir les gestionnaires Gin concentrés strictement sur l'analyse JSON et les codes HTTP. Déléguer toute la logique à la couche de service pour garder les fichiers petits et économes en tokens.
Structure du Projet
project/
├── cmd/ # Points d'entrée de l'application
│ └── server/
│ └── main.go
├── internal/ # Code d'application privé
│ ├── config/ # Chargement de l'environnement (viper/godotenv)
│ ├── handlers/ # Gestionnaires/contrôleurs HTTP Gin
│ ├── models/ # Structures de domaine et interfaces
│ ├── repository/ # Couche d'accès à la base de données
│ └── service/ # Logique métier
├── pkg/ # Bibliothèques utilitaires publiques (optionnel)
├── go.mod
└── go.sum
Conventions de Nommage
- Fichiers/Répertoires :
snake_case ou minuscules (ex. user_repository.go)
- Structures/Interfaces :
PascalCase pour les exportés, camelCase pour les non exportés.
- Fonctions :
PascalCase (ex. CreateUser).
- Interfaces : Se terminent généralement par
-er (ex. UserReader, DataWriter).
Patrons Architecturaux
- Architecture Propre :
Handler -> Service -> Repository. Les handlers analysent le JSON et retournent les codes HTTP. Les services contiennent la logique métier. Les repositories gèrent le SQL.
- Injection de Dépendances : Passer les interfaces dans les constructeurs. ex.
func NewUserService(repo models.UserRepository) *UserService.
- Gestion des Erreurs : Ne jamais utiliser
panic. Toujours retourner error comme dernière valeur de retour. Envelopper les erreurs avec du contexte (fmt.Errorf("échec de la récupération de l'utilisateur : %w", err)).
- Goroutines : Utiliser avec prudence pour les tâches d'arrière-plan ; toujours passer
context.Context dans la chaîne d'appels pour gérer les timeouts et les annulations.
Stratégies de Test
- Framework : Package
testing standard + testify pour les assertions/mocks.
- Mocking : Générer des mocks à partir des interfaces en utilisant
mockery ou gomock pour les couches Repository et Service.
- Tests pilotés par tableaux : Utiliser des slices de structures pour tester plusieurs entrées/sorties dans une seule fonction de test.