Как реализованы триггеры

«Как реализованы триггеры» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go нет встроенной поддержки триггеров как в SQL, но их можно эмулировать с помощью методов-наблюдателей или паттерна "наблюдатель". Например:

type Trigger func(old, new interface{})

type Observable struct {
    value   interface{}
    triggers []Trigger
}

func (o *Observable) Set(value interface{}) {
    old := o.value
    o.value = value
    // Вызываем все триггеры
    for _, trigger := range o.triggers {
        trigger(old, value)
    }
}

func (o *Observable) AddTrigger(t Trigger) {
    o.triggers = append(o.triggers, t)
}

Использование:

obj := Observable{}
obj.AddTrigger(func(old, new interface{}) {
    fmt.Printf("Value changed from %v to %vn", old, new)
})
obj.Set(42) // Вызовет триггер

Для более сложных сценариев можно использовать event bus или готовые библиотеки типа github.com/asaskevich/EventBus.