Вышел Go 1.24 (интерактивные примеры тут)
ПроизводительностьСнижение нагрузки на CPU на 2-3% благодаря:
- Новой реализации встроенных map на основе Swiss Tables
- Более эффективному выделению памяти для малых объектов
- Новой внутренней реализации mutex в runtime
Обобщенные псевдонимы типовТеперь можно создавать параметризованные псевдонимы типов, например:
type Set[T comparable] = map[T]bool
Слабые указателиДобавлен новый пакет weak, который предоставляет weak pointers – указатели, которые не препятствуют сборке мусора. Это полезно для реализации кэшей и других структур данных, где нужно избежать утечек памяти.
Улучшенные финализаторыПредставлена новая функция runtime.AddCleanup, которая является более гибкой и эффективной альтернативой runtime.SetFinalizer. Она позволяет:
- Прикреплять несколько функций очистки к одному объекту
- Работать с внутренними указателями
- Избегать утечек памяти при циклических ссылках
Ограниченный доступ к файловой системеНовый тип os.Root позволяет ограничить файловые операции определенной директорией, что полезно для безопасной работы с файлами.
// Пример использования os.Root
root, err := os.OpenRoot("/path/to/dir")
if err != nil {
log.Fatal(err)
}
// Операции ограничены директорией
f, err := root.Open("file.txt")
if err != nil {
log.Fatal(err)
}
Улучшения для тестированияДобавлен метод testing.B.Loop, который предоставляет более простой и надежный способ написания бенчмарков:
func BenchmarkMyFunc(b *testing.B) {
// Вместо for i := 0; i < b.N; i++
for b.Loop() {
// код бенчмарка
}
}
Новый пакет testing/synctest позволяет тестировать код с временными операциями, используя синтетические часы вместо реального времени.
Зависимости инструментовТеперь модули Go могут отслеживать зависимости исполняемых файлов с помощью директив tool в go.mod.
Чтобы добавить зависимость инструмента, используйте go get -tool:
go get -tool golang.org/x/tools/cmd/stringer
Это добавляет зависимость tool с директивой require в go.mod:
module mymod
go 1.24
tool golang.org/x/tools/cmd/stringer
require (
golang.org/x/mod v0.22.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/tools v0.29.0 // indirect
)
Теперь команда go tool может запускать эти инструменты в дополнение к инструментам, поставляемым с дистрибутивом Go:
go tool stringer
КриптографияДобавлены новые криптографические пакеты:
crypto/sha3 - реализация SHA-3
crypto/hkdf - реализация HKDF
crypto/pbkdf2 - реализация PBKDF2
Работа с JSONДобавлена новая опция omitzero для тегов структур, которая позволяет пропускать нулевые значения при сериализации в JSON. В отличие от omitempty, она работает корректно с time.Time и другими типами, имеющими метод IsZero().
Инструментарий
Go модули теперь могут отслеживать зависимости от исполняемых файлов с помощью директив tool в go.mod. Команды go build, go install и go test получили флаг -json для вывода результатов в формате JSON.
🫥 Cross Join
⠀