Ответ
Императивный подход описывает как выполнить задачу, явно указывая последовательность шагов (например, циклы, условия). Декларативный — что нужно получить, скрывая детали реализации.
Пример на Go:
// Императивный стиль: суммируем четные числа
sum := 0
nums := []int{1, 2, 3, 4}
for _, num := range nums {
if num%2 == 0 {
sum += num
}
}
// sum = 6
// Декларативный стиль (используя функции из пакета slices, Go 1.21+)
// Сначала фильтруем, затем редуцируем (суммируем)
// (Для slices.Reduce и slices.Filter требуется импорт "golang.org/x/exp/slices" или Go 1.21+)
// import "slices" // для Go 1.21+
// import "golang.org/x/exp/slices" // для более старых версий Go
// Пример использования slices.Filter и slices.Reduce (требует Go 1.21+)
// filtered := slices.Filter(nums, func(n int) bool { return n%2 == 0 })
// evenSum := slices.Reduce(filtered, func(a, b int) int { return a + b }, 0)
// evenSum = 6
// Более простой декларативный пример в Go (без сторонних пакетов, через композицию функций)
// Хотя Go не является чисто декларативным языком, можно писать в более декларативном стиле.
// Например, используя функции высшего порядка или функциональные опции.
// func SumEven(numbers []int) int {
// return Sum(Filter(numbers, IsEven))
// }
// func IsEven(n int) bool { return n%2 == 0 }
// func Filter(numbers []int, predicate func(int) bool) []int { ... }
// func Sum(numbers []int) int { ... }
Ключевое отличие: в императивном коде управление потоком явное, а в декларативном логика выражается через композицию функций, DSL (Domain Specific Language) или абстракции, скрывающие детали выполнения.