Какие ключевые изменения в Go, начиная с версии 1.18, вы считаете наиболее важными и почему?

Ответ

Это отличный вопрос для оценки того, насколько кандидат следит за развитием языка. Начиная с версии 1.18, в Go произошли фундаментальные изменения.

Ключевые из них:

1. Дженерики (Generics) — Go 1.18

Это самое значительное изменение в истории языка. Дженерики (параметрический полиморфизм) позволяют писать функции и типы данных, которые работают с любым типом из определённого набора.

  • Почему это важно: Устраняет необходимость в дублировании кода для разных типов (например, MaxInt, MaxFloat64) или использовании interface{} с последующим приведением типов, что было менее безопасно и производительно.
// Пример обобщенной функции для поиска минимального элемента
func Min[T constraints.Ordered](a, b T) T {
    if a < b {
        return a
    }
    return b
}

// fmt.Println(Min(10, 20))       // Работает с int
// fmt.Println(Min(10.5, 20.2))   // Работает с float64

2. Рабочие области (Workspaces) — Go 1.18

Режим go work позволяет одновременно работать с несколькими модулями, как если бы они находились в одном. Это упрощает разработку проектов, состоящих из нескольких микросервисов или библиотек.

  • Почему это важно: Больше не нужно использовать директивы replace в go.mod для локальной разработки, что было неудобно и приводило к ошибкам.

3. Оптимизация на основе профиля (Profile-Guided Optimization, PGO) — Go 1.20+

PGO позволяет компилятору использовать данные профилирования (информацию о том, какие части кода выполняются чаще всего) для более эффективной оптимизации приложения.

  • Почему это важно: Может автоматически повысить производительность приложения на 2-7% без изменения кода, просто за счёт сбора профиля на реальных нагрузках и пересборки с ним.

4. Новые функции в стандартной библиотеке

  • slices и maps (Go 1.21): Появились новые пакеты для удобной работы со срезами и картами, использующие дженерики (например, slices.Sort, slices.Compact, maps.Keys).
  • slog (Go 1.21): Новый пакет для структурированного логирования, ставший стандартом де-факто.