Ответ
Это отличный вопрос для оценки того, насколько кандидат следит за развитием языка. Начиная с версии 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)) // Работает с float642. Рабочие области (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): Новый пакет для структурированного логирования, ставший стандартом де-факто.