Go Academy · Урок

Хуки и области видимости

Настраивайте запросы

Урок 4 из 413 шагов

«Хуки и области видимости» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Обработчики и области запросов

GORM предоставляет два инструмента настройки: обработчики автоматически запускают код при событиях жизненного цикла, а области запросов объединяют повторно используемую логику запросов. Вместе они делают доступ к данным чистым и согласованным.

Что такое обработчики

Обработчики — это методы модели, которые GORM вызывает до или после операции: BeforeCreate, AfterCreate, BeforeUpdate, BeforeDelete и другие.

Обработчик BeforeCreate

Определите в модели метод с подходящей сигнатурой. В этом примере мы задаём UUID до вставки записи.

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

Проверка данных в обработчиках

Верните ошибку из обработчика, чтобы прервать операцию. GORM откатывает окружающую транзакцию, поэтому недопустимые данные никогда не попадают в базу данных.

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

Обработчики выполняются в транзакции

Аргумент tx *gorm.DB — это транзакция, которую использует GORM. Если Вы записываете связанные данные внутри обработчика, используйте этот tx, чтобы изменения зафиксировались или откатились атомарно вместе с основной операцией.

Что такое области

Область — это функция, которая принимает и возвращает *gorm.DB, инкапсулируя фрагмент запроса. Вы применяете её с помощью db.Scopes(...) и повторно используете во многих запросах.

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

Применение областей

Передайте в Scopes одну или несколько областей. Они комбинируются, поэтому Вы можете декларативно объединять фильтры в итоговый запрос.

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

Рабочий пример обработчика и имитации области

GORM нужна база данных, поэтому в этом запускаемом примере обычные функции имитируют обработчик BeforeCreate и повторно используемый фильтр, подобный области.

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

Области для постраничной выдачи

Обычно область формирует постраничную выдачу по номеру страницы, инкапсулируя Offset и Limit, чтобы каждый конечный маршрут для списков работал одинаково.

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

Обработчики и логика приложения

Обработчики централизуют сквозные задачи, такие как временные метки, читаемые идентификаторы и поля аудита. Сложную бизнес-логику храните в службах, а не в обработчиках, чтобы поведение оставалось предсказуемым и пригодным для тестирования.

Пропуск обработчиков

Для массовых операций можно отключить обработчики с помощью db.Session(&gorm.Session{SkipHooks: true}). Это ускоряет крупный импорт, но пропускает Ваши проверки, поэтому используйте такую возможность осторожно.

Быстрая проверка

Проверьте свои знания об обработчиках и областях.

Итоги

Вы узнали об обработчиках и областях:

  • Обработчики выполняются вокруг событий жизненного цикла; возврат ошибки прерывает операцию и откатывает транзакцию
  • Обработчики выполняются внутри транзакции через аргумент tx
  • Области — это повторно используемые функции *gorm.DB, применяемые с помощью Scopes
  • Используйте области для фильтров и постраничной выдачи
  • SkipHooks обходит обработчики при массовой обработке
Можно начать бесплатно

Изучай Go с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Хуки и области видимости» бесплатный?

Да — полный текст урока «Хуки и области видимости» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Хуки и области видимости»?

Настраивайте запросы Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Хуки и области видимости»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Модели и AutoMigrate
  2. Операции CRUD
  3. Ассоциации
  4. Хуки и области видимости
← Назад к Go Academy