GoMiddleExperience
Какие версии, возможности или изменения экосистемы Go (Golang) важно учитывать на собеседованиях в 2026 году?
В 2026 году важны: Go 1.22+ (исправление loop variable semantics), rangefunc (range over functions, Go 1.23), улучшенные generics, toolchain в go.mod, профилирование через pprof и runtime/trace. Знание этих изменений отличает актуального кандидата.
Go 1.22: исправление семантики переменной цикла
До Go 1.22 переменная цикла for i := range ... была одной переменной, захватываемой всеми замыканиями. С Go 1.22 каждая итерация создаёт новую переменную — классический баг с горутинами в цикле исчез.
// Go 1.22+: корректно без явного `i := i`
for i := range 5 {
go func() {
fmt.Println(i) // каждая горутина видит свой i
}()
}
Go 1.22: range over integers
// Go 1.22+
for i := range 10 {
fmt.Println(i) // 0..9
}
Go 1.23: rangefunc (range over functions)
Экспериментальная фича Go 1.22, стабилизированная в 1.23 — итерация по пользовательским типам через функцию-итератор:
// iter.Seq — стандартный тип итератора
import "iter"
func Fibonacci() iter.Seq[int] {
return func(yield func(int) bool) {
a, b := 0, 1
for {
if !yield(a) {
return
}
a, b = b, a+b
}
}
}
for n := range Fibonacci() {
if n > 100 {
break
}
fmt.Println(n)
}
Toolchain в go.mod (Go 1.21+)
Директива toolchain в go.mod гарантирует воспроизводимость сборки:
// go.mod
go 1.23
toolchain go1.23.4
Улучшения generics
Go 1.21 добавил пакеты slices, maps, cmp — типобезопасные утилиты, которые раньше реализовывались вручную:
import (
"cmp"
"slices"
)
nums := []int{3, 1, 4, 1, 5, 9}
slices.Sort(nums)
fmt.Println(slices.Max(nums)) // 9
type Person struct{ Name string; Age int }
people := []Person{{"Alice", 30}, {"Bob", 25}}
slices.SortFunc(people, func(a, b Person) int {
return cmp.Compare(a.Age, b.Age)
})
Профилирование и observability
runtime/trace— timeline горутин, GC, syscalls. Запуск:go test -trace trace.out ./..., просмотр:go tool trace trace.out.net/http/pprof— CPU, heap, goroutine, mutex профили через HTTP.- GOMEMLIMIT (Go 1.19+) — критично для контейнерных окружений.
Что важно знать на собеседовании в 2026
- Разница поведения loop variable до и после Go 1.22.
- Как работает rangefunc и зачем нужен
iter.Seq. - Новые пакеты стандартной библиотеки:
slices,maps,cmp,log/slog. log/slog(Go 1.21) — структурированное логирование в stdlib, заменяетlogrus/zapдля многих проектов.
Подводные камни
- Кандидаты, не следящие за Go releases, могут применять обходные пути, устранённые в новых версиях.
- rangefunc меняет привычные паттерны итерации — стоит понять модель yield-функций.
- Директива
toolchainне автоматически скачивает нужный Go — нуженgotoolchain=autoв переменных окружения илиGOTOOLCHAIN=auto. - Пакет
slices.Sortиспользует pdqsort, нестабильный — для стабильной сортировки нуженslices.SortStableFunc. - Новый
log/slogнесовместим по интерфейсу сlog.Logger— миграция требует обёрток. - Go 1.21 изменил спецификацию min/max как встроенных функций — не путайте с
math.Min/math.Max(они для float64).
What hurts your answer
- Рассказывать устаревший подход как актуальную практику
- Не отличать личный legacy-опыт от состояния экосистемы в 2026 году
- Игнорировать migration notes и deprecated API
What they're listening for
- Понимает актуальное состояние Go (Golang)
- Отличает современные практики от legacy-подходов
- Учитывает миграции, deprecated API и совместимость