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 и совместимость

Related topics