Hooks et portées
Personnaliser les requêtes
Hooks et portées est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.
Points d'extension et portées
GORM propose deux outils de personnalisation : les points d'extension exécutent automatiquement du code autour des événements du cycle de vie, tandis que les portées regroupent une logique de requête réutilisable. Ensemble, ils rendent l'accès aux données clair et cohérent.
Que sont les points d'extension
Les points d'extension sont des méthodes de votre modèle que GORM appelle avant ou après une opération : BeforeCreate, AfterCreate, BeforeUpdate, BeforeDelete, entre autres.
Un point d'extension BeforeCreate
Définissez une méthode ayant la signature appropriée sur le modèle. Ici, nous définissons un UUID avant l'insertion de l'enregistrement.
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.UUID = uuid.NewString()
return nil
}Validation dans les points d'extension
Renvoyez une erreur depuis un point d'extension pour interrompre l'opération. GORM annule la transaction environnante, de sorte que les données invalides n'atteignent jamais la base de données.
func (u *User) BeforeSave(tx *gorm.DB) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
return nil
}Les points d'extension s'exécutent dans une transaction
L'argument tx *gorm.DB est la transaction utilisée par GORM. Si vous écrivez des données associées dans un point d'extension, utilisez ce tx afin que ces données soient validées ou annulées atomiquement avec l'opération principale.
Que sont les portées
Une portée est une fonction qui reçoit et renvoie un *gorm.DB, encapsulant un fragment de requête. Vous l’appliquez avec db.Scopes(...) et la réutilisez dans de nombreuses requêtes.
func ActiveUsers(db *gorm.DB) *gorm.DB {
return db.Where("active = ?", true)
}Appliquer des portées
Transmettez une ou plusieurs portées à Scopes. Elles se composent entre elles, ce qui vous permet de combiner des filtres de manière déclarative pour obtenir une requête finale.
db.Scopes(ActiveUsers, Recent).Find(&users)Simulation exécutable d’un point d’accroche et d’une portée
GORM a besoin d’une base de données. Cet exemple exécutable simule donc un point d’accroche BeforeCreate et un filtre réutilisable similaire à une portée, à l’aide de fonctions simples.
package main
import (
"errors"
"fmt"
)
type User struct {
Name string
Age int
Active bool
}
func beforeCreate(u *User) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
if u.Name == "" {
u.Name = "anonymous"
}
return nil
}
func activeOnly(users []User) []User {
var out []User
for _, u := range users {
if u.Active {
out = append(out, u)
}
}
return out
}
func main() {
u := User{Age: 30, Active: true}
if err := beforeCreate(&u); err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("created:", u.Name)
all := []User{u, {Name: "Lin", Active: false}}
fmt.Println("active count:", len(activeOnly(all)))
}Portées pour la pagination
Une portée courante génère la pagination à partir d’un numéro de page et encapsule Offset et Limit, afin que chaque point d’accès de liste utilise la pagination de la même manière.
func Paginate(page, size int) func(*gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
return db.Offset((page - 1) * size).Limit(size)
}
}Points d’accroche ou logique applicative
Les points d’accroche centralisent les préoccupations transversales comme les horodatages, les identifiants lisibles et les champs d’audit. Gardez la logique métier complexe dans les services, et non dans les points d’accroche, afin que le comportement reste prévisible et facile à vérifier.
Ignorer les points d’accroche
Pour les opérations en masse, vous pouvez désactiver les points d’accroche avec db.Session(&gorm.Session{SkipHooks: true}). Cela accélère les importations volumineuses, mais ignore vos validations : utilisez donc cette possibilité avec prudence.
Vérification rapide
Vérifiez vos connaissances sur les points d’accroche et les portées.
Récapitulatif
Vous avez appris à utiliser les points d’accroche et les portées :
- Les points d’accroche s’exécutent autour des événements du cycle de vie ; renvoyer une erreur interrompt l’opération et annule la transaction
- Les points d’accroche s’exécutent dans la transaction via l’argument tx
- Les portées sont des fonctions réutilisables de type *gorm.DB, appliquées avec Scopes
- Utilisez les portées pour les filtres et la pagination
- SkipHooks contourne les points d’accroche pour les opérations en masse
Apprends Go avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 51
- Leçons
- 203
Questions Fréquemment Posées
La leçon « Hooks et portées » est-elle gratuite ?
Oui — le texte complet de « Hooks et portées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Hooks et portées » ?
Personnaliser les requêtes Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Go Academy ?
Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Hooks et portées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?
Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Modèles et AutoMigrate
- Opérations CRUD
- Associations
- Hooks et portées