0Pricing
Go Academy · Lekcja

Hooki i zakresy

Dostosowuj zapytania

Hooki i zakresy to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Hooki i scope'y

GORM oferuje dwa narzędzia dostosowywania: hooki automatycznie wykonują kod wokół zdarzeń cyklu życia, a scope'y grupują wielokrotnie używaną logikę zapytań. Razem pomagają utrzymać czysty i spójny dostęp do danych.

Czym są hooki

Hooki to metody modelu, które GORM wywołuje przed operacją lub po niej: BeforeCreate, AfterCreate, BeforeUpdate, BeforeDelete i inne.

Hook BeforeCreate

Zdefiniuj w modelu metodę z właściwą sygnaturą. W tym przykładzie ustawiamy UUID przed wstawieniem rekordu.

func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.UUID = uuid.NewString()
    return nil
}

Walidacja w hookach

Zwrócenie błędu z hooka przerywa operację. GORM wycofuje otaczającą transakcję, więc nieprawidłowe dane nigdy nie trafiają do bazy danych.

func (u *User) BeforeSave(tx *gorm.DB) error {
    if u.Age < 0 {
        return errors.New("age cannot be negative")
    }
    return nil
}

Hooki działają w transakcji

Argument tx *gorm.DB oznacza transakcję używaną przez GORM. Jeśli w hooku zapisujesz powiązane dane, użyj tego obiektu tx, aby zostały zatwierdzone lub wycofane atomowo razem z główną operacją.

Czym są zakresy

Zakres to funkcja, która przyjmuje i zwraca *gorm.DB, enkapsulując fragment zapytania. Stosuje się go za pomocą db.Scopes(...) i można go ponownie wykorzystywać w wielu zapytaniach.

func ActiveUsers(db *gorm.DB) *gorm.DB {
    return db.Where("active = ?", true)
}

Stosowanie zakresów

Przekaż jeden lub więcej zakresów do Scopes. Są one składane, dzięki czemu można deklaratywnie łączyć filtry w końcowe zapytanie.

db.Scopes(ActiveUsers, Recent).Find(&users)

Wykonywalny hook i symulacja zakresu

GORM wymaga bazy danych, dlatego ten wykonywalny przykład symuluje hook BeforeCreate i filtr przypominający wielokrotnego użytku zakres, używając zwykłych funkcji.

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)))
}

Zakresy do stronicowania

Typowy zakres generuje stronicowanie na podstawie numeru strony, enkapsulując Offset i Limit, dzięki czemu każdy endpoint listy dzieli wyniki na strony w ten sam sposób.

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)
    }
}

Hooki a logika aplikacji

Hooki centralizują przekrojowe zagadnienia, takie jak znaczniki czasu, slugi i pola audytowe. Rozbudowaną logikę biznesową należy umieszczać w usługach, a nie w hookach, aby zachowanie pozostało przewidywalne i możliwe do testowania.

Pomijanie hooków

W przypadku operacji zbiorczych można wyłączyć hooki za pomocą db.Session(&gorm.Session{SkipHooks: true}). Przyspiesza to duże importy, ale pomija walidację, dlatego należy używać tej opcji ostrożnie.

Szybkie sprawdzenie

Sprawdź swoją wiedzę o hookach i zakresach.

Podsumowanie

Dowiedzieli się Państwo, czym są hooki i zakresy:

  • Hooki uruchamiają się wokół zdarzeń cyklu życia; zwrócenie błędu przerywa operację i powoduje wycofanie transakcji
  • Hooki działają wewnątrz transakcji za pośrednictwem argumentu tx
  • Zakresy to wielokrotnego użytku funkcje *gorm.DB stosowane za pomocą Scopes
  • Zakresów należy używać do filtrowania i stronicowania
  • SkipHooks pomija hooki podczas pracy zbiorczej

Często zadawane pytania

Czy lekcja „Hooki i zakresy” jest bezpłatna?

Tak — pełny tekst „Hooki i zakresy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Hooki i zakresy”?

Dostosowuj zapytania Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Hooki i zakresy”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Modele i AutoMigrate
  2. Operacje CRUD
  3. Powiązania
  4. Hooki i zakresy
← Powrót do Go Academy