Примечания к выпуску Go 1.24

Введение в Go 1.24

Последний выпуск Go, версии 1.24, вышел в феврале 2025, через шесть месяцев после Go 1.23. Большинство изменений касаются реализации инструментария, среды выполнения и библиотек. Как и всегда, выпуск сохраняет обещание совместимости Go 1. Ожидается, что почти все программы на Go продолжат компилироваться и выполняться так же, как и раньше.

Изменения в языке

Go 1.24 теперь полностью поддерживает псевдонимы дженерик-типов: псевдоним типа может быть параметризован так же, как и определённый тип. Для получения дополнительной информации см. спецификацию языка. На данный момент эта функция может быть отключена установкой GOEXPERIMENT=noaliastypeparams; но параметр aliastypeparams будет удалён в Go 1.25.

Инструменты

Команда go

Модули Go теперь могут отслеживать исполняемые зависимости с помощью директив tool в go.mod. Это устраняет необходимость предыдущего обходного пути, при котором инструменты добавлялись как пустые импорты в файл с соглашением об именовании «tools.go». Команда go tool теперь может запускать эти инструменты, а также инструменты, поставляемые вместе с Go. Для получения дополнительной информации см. документацию.

Новый флаг -tool для команды go get добавляет директиву инструмента в текущий модуль для указанных пакетов, а также добавляет директивы require.

Новый tool мета-паттерн ссылается на все инструменты в текущем модуле. Его можно использовать для обновления всех инструментов командой go get tool или для установки их в каталог GOBIN с помощью go install tool.

Исполняемые файлы, созданные командой go run и новое поведение go tool, теперь кешируются в кэше сборки Go. Это делает повторные запуски быстрее за счёт увеличения размера кэша. См. #69290.

Команды go build и go install теперь принимают флаг -json, который выводит результаты сборки и ошибки в виде структурированного JSON на стандартный вывод. За подробностями обращайтесь к go help buildjson.

Кроме того, go test -json теперь выводит результаты сборки и ошибки в формате JSON, перемешанные с JSON результатами тестов. Они различаются по новым типам Action, но если они вызывают проблемы в системе интеграции тестов, вы можете вернуться к текстовому выводу сборки с помощью настройки GODEBUG gotestjsonbuildtext=1.

Новая переменная окружения GOAUTH предоставляет гибкий способ аутентификации запросов частных модулей. Дополнительную информацию см. в go help goauth.

Команда go build теперь устанавливает версию основного модуля в скомпилированном бинарном файле на основе тега системы контроля версий и/или коммита. Если есть несохранённые изменения, будет добавлен суффикс +dirty. Используйте флаг -buildvcs=false, чтобы исключить информацию системы контроля версий из бинарного файла.

Новая настройка GODEBUG toolchaintrace=1 может использоваться для трассировки процесса выбора инструментария команды go.

Cgo

Cgo поддерживает новые аннотации для C-функций, чтобы улучшить производительность во время выполнения. #cgo noescape cFunctionName указывает компилятору, что память, переданная в C-функцию cFunctionname, не покидает пределы функции. #cgo nocallback cFunctionName указывает компилятору, что C-функция cFunctionName не вызывает какие-либо Go-функции. За дополнительной информацией обращайтесь к документации cgo.

Cgo в настоящее время отказывается компилировать вызовы функции на C, которая имеет несколько несовместимых объявлений. Например, если функция f объявлена как void f(int) и void f(double), cgo сообщит об ошибке вместо того, чтобы, возможно, сгенерировать неверную последовательность вызова для f(0). В этом выпуске добавлена улучшенная проверка для этой ошибки, когда несовместимые объявления находятся в разных файлах. См. #67699.

Objdump

Инструмент objdump теперь поддерживает дизассемблирование на 64-битной архитектуре LoongArch (GOARCH=loong64), RISC-V (GOARCH=riscv64) и S390X (GOARCH=s390x).

Vet

Новый анализатор tests сообщает о распространённых ошибках в объявлениях тестов, фаззеров, бенчмарков и примеров в тестовых пакетах, таких как некорректные имена, неправильные сигнатуры или примеры, описывающие несуществующие идентификаторы. Некоторые из этих ошибок могут привести к тому, что тесты не будут запускаться. Этот анализатор входит в подмножество анализаторов, которые запускаются командой go test.

Существующий анализатор printf теперь сообщает диагностическое сообщение при вызовах вида fmt.Printf(s), где s — это неконстантная строка формата без дополнительных аргументов. Подобные вызовы почти всегда являются ошибкой, поскольку значение s может содержать символ %; вместо этого следует использовать fmt.Print. См. #60529. Эта проверка может находить ошибки в существующем коде, поэтому она применяется только тогда, когда версия языка (как указана директивой go в go.mod или комментариями //go:build) не ниже Go 1.24, чтобы избежать постоянных ошибок в системах непрерывной интеграции при обновлении до инструментария Go 1.24.

Существующий анализатор buildtag теперь сообщает диагностическое сообщение, если в директиве //go:build содержится недопустимое ограничение основной версии Go. Например, //go:build go1.23.1 ссылается на патч-релиз; вместо этого следует использовать //go:build go1.23. См. #64127.

Существующий анализатор copylock теперь сообщает диагностическое сообщение, если переменная, объявленная в трёхчастном цикле for вида for i := iter(); done(i); i = next(i) { ... }, содержит sync.Locker, например sync.Mutex. В Go 1.22 изменилось поведение таких циклов: для каждой итерации создаётся новая переменная, копируя значение из предыдущей итерации; эта операция копирования небезопасна для блокировок. См. #66387.

GOCACHEPROG

Механизм кэширования внутренних бинарных файлов и тестов пакета cmd/go теперь может быть реализован дочерними процессами, реализующими JSON-протокол между инструментом cmd/go и дочерним процессом, указанным переменной окружения GOCACHEPROG. Ранее эта функциональность находилась за пределами GOEXPERIMENT. Для получения деталей протокола см. документацию.

Среда выполнения

Несколько улучшений производительности среды выполнения сократили нагрузку на процессор на 2–3% в среднем по набору репрезентативных бенчмарков. Результаты могут отличаться в зависимости от приложения. Эти улучшения включают в себя новую встроенную реализацию map на основе Swiss Tables, более эффективное выделение памяти для маленьких объектов и новую внутреннюю реализацию мьютекса в среде выполнения.

Новая встроенная реализация map и новый внутренний мьютекс в среде выполнения могут быть отключены путём установки GOEXPERIMENT=noswissmap и GOEXPERIMENT=nospinbitmutex во время сборки соответственно.

Компилятор

Компилятор уже запрещал определение новых методов с типами получателей, которые были сгенерированы cgo, но было возможно обойти это ограничение с помощью псевдонима типа. В Go 1.24 теперь всегда выдается ошибка, если получатель обозначает тип, сгенерированный cgo, независимо от того, указывается ли он напрямую или косвенно (через псевдоним типа).

Линковщик

Линковщик теперь по умолчанию генерирует GNU build ID (запись ELF NT_GNU_BUILD_ID) на платформах ELF и UUID (команда загрузки Mach-O LC_UUID) на macOS. Build ID или UUID выводятся из Go build ID. Отключение возможно с помощью флага линковщика -B none, либо переопределение возможно с помощью флага -B 0xNNNN с заданным пользователем шестнадцатеричным значением.

Bootstrap

Как указано в заметках о релизе Go 1.22, Go 1.24 теперь требует Go 1.22.6 или более поздней версии для bootstrap. Ожидается, что Go 1.26 будет требовать точечного релиза Go 1.24 или более поздней версии для bootstrap.

Стандартная библиотека

Доступ к файловой системе с ограничением по директории

Новый тип os.Root предоставляет возможность выполнять операции с файловой системой внутри определённой директории.

Функция os.OpenRoot открывает директорию и возвращает os.Root. Методы os.Root работают внутри директории и не допускают пути, которые ссылаются на расположения вне директории, включая те, что следуют по символическим ссылкам за пределы директории. Методы os.Root отражают большинство операций файловой системы, доступных в пакете os, включая, например, os.Root.Open, os.Root.Create, os.Root.Mkdir, и os.Root.Stat,

Новая функция для бенчмарков

Бенчмарки теперь могут использовать более быстрый и менее подверженный ошибкам метод testing.B.Loop для выполнения итераций бенчмарка, например for b.Loop() { ... }, вместо типичных структур циклов, использующих b.N, таких как for range b.N. Это даёт два существенных преимущества:

Улучшенные финализаторы

Новая функция runtime.AddCleanup является механизмом финализации, который более гибкий, эффективный и менее подверженный ошибкам, чем runtime.SetFinalizer. AddCleanup привязывает функцию очистки к объекту, которая будет выполнена один раз, когда объект станет недоступен. Однако, в отличие от SetFinalizer, к одному объекту можно привязать несколько функций очистки, функции очистки можно привязать к внутренним указателям, функции очистки обычно не вызывают утечек памяти, когда объекты образуют цикл, и функции очистки не задерживают освобождение объекта или объектов, на которые он указывает. Новый код должен предпочитать AddCleanup перед SetFinalizer.

Новый пакет weak

Новый пакет weak предоставляет слабые указатели.

Слабые указатели — это примитив низкого уровня, предназначенный для создания эффективных по памяти структур, таких как слабые карты для ассоциации значений, карты канонизации для всего, что не покрывается пакетом unique, и различные виды кэшей. Для поддержки этих случаев использования, этот релиз также предоставляет runtime.AddCleanup и maphash.Comparable.

Новый пакет crypto/mlkem

Новый пакет crypto/mlkem реализует ML-KEM-768 и ML-KEM-1024.

ML-KEM — это постквантовый механизм обмена ключами, ранее известный как Kyber и описанный в FIPS 203.

Новые пакеты crypto/hkdf, crypto/pbkdf2 и crypto/sha3

Новый пакет crypto/hkdf реализует функцию извлечения и расширения ключей HKDF, основанную на HMAC, как определено в RFC 5869.

Новый пакет crypto/pbkdf2 реализует функцию производной пароля PBKDF2, как определено в RFC 8018.

Новый пакет crypto/sha3 реализует хеш-функцию SHA-3 и расширяемые функции вывода SHAKE и cSHAKE, как описано в FIPS 202.

Все три пакета основаны на существующих пакетах golang.org/x/crypto/....

Соответствие FIPS 140-3

В данном релизе включена новая группа механизмов для обеспечения соответствия FIPS 140-3.

Go Cryptographic Module — это набор внутренних пакетов стандартной библиотеки, которые прозрачно используются для реализации алгоритмов, одобренных FIPS 140-3. Приложения не требуют изменений для использования Go Cryptographic Module с одобренными алгоритмами.

Новая переменная окружения GOFIPS140 может быть использована для выбора версии Go Cryptographic Module, которая будет использоваться в сборке. Новая настройка GODEBUG fips140 может быть использована для включения режима FIPS 140-3 во время выполнения.

Go 1.24 включает версию Go Cryptographic Module v1.0.0, которая в настоящее время тестируется в лаборатории, аккредитованной CMVP.

Новый экспериментальный пакет testing/synctest

Новый экспериментальный пакет testing/synctest предоставляет поддержку тестирования параллельного кода.

Для получения дополнительной информации см. документацию пакета.

Пакет synctest является экспериментальным и должен быть включён путём установки переменной GOEXPERIMENT=synctest во время сборки. API пакета может быть изменено в будущих релизах. См. проблему #67434 для получения дополнительной информации и обратной связи.

Незначительные изменения в библиотеке

archive

Реализации (*Writer).AddFS в пакетах archive/zip и archive/tar теперь записывают заголовок директории для пустой директории.

bytes

Пакет bytes добавляет несколько функций, работающих с итераторами:

crypto/aes

Значение, возвращаемое функцией NewCipher, больше не реализует методы NewCTR, NewGCM, NewCBCEncrypter и NewCBCDecrypter. Эти методы были не задокументированы и не были доступны на всех архитектурах. Вместо этого значение типа Block должно передаваться напрямую в соответствующие функции из пакета crypto/cipher. Пока что crypto/cipher по-прежнему проверяет наличие этих методов у значений типа Block, даже если они больше не используются стандартной библиотекой.

crypto/cipher

Новая функция NewGCMWithRandomNonce возвращает AEAD, реализующий AES-GCM, генерируя случайный nonce во время вызова метода Seal и добавляя его в начало зашифрованных данных.

Реализация Stream, возвращаемая функцией NewCTR при использовании с crypto/aes, теперь работает в несколько раз быстрее на amd64 и arm64.

Функции NewOFB, NewCFBEncrypter и NewCFBDecrypter теперь устарели. Режимы OFB и CFB не обеспечивают аутентификацию, что в общем случае позволяет активным атакам манипулировать данными и восстанавливать исходный текст. Рекомендуется использовать вместо них режимы с AEAD. Если требуется неаутентифицированный Stream режим, рекомендуется использовать NewCTR.

crypto/ecdsa

Метод PrivateKey.Sign теперь генерирует детерминированную подпись согласно стандарту RFC 6979, если источник случайных чисел равен nil.

crypto/md5

Значение, возвращаемое функцией md5.New, теперь также реализует интерфейс encoding.BinaryAppender.

crypto/rand

Функция Read теперь гарантированно не завершается ошибкой. Она всегда возвращает nil в качестве значения ошибки. Если функция Read столкнётся с ошибкой при чтении из Reader, программа аварийно завершится. Следует отметить, что API платформы, используемое стандартным Reader, документировано как всегда успешное, поэтому это изменение повлияет только на программы, которые переопределяют переменную Reader. Исключением являются ядра Linux до версии 3.17, где стандартный Reader всё ещё открывает /dev/urandom и может завершаться с ошибкой.

В Linux 6.11 и более поздних версиях Reader теперь использует системный вызов getrandom через vDSO. Это делает операции чтения в несколько раз быстрее, особенно при небольших объёмах данных.

В OpenBSD Reader теперь использует arc4random_buf(3).

Новая функция Text может использоваться для генерации криптографически безопасных случайных текстовых строк.

crypto/rsa

GenerateKey теперь возвращает ошибку, если запрашивается ключ длиной менее 1024 бит. Все методы Sign, Verify, Encrypt и Decrypt теперь возвращают ошибку, если используются с ключом длиной менее 1024 бит. Такие ключи небезопасны и не должны использоваться. Настройка GODEBUG rsa1024min=0 восстанавливает старое поведение, но мы рекомендуем делать это только при необходимости и только в тестах, например, добавив строку //go:debug rsa1024min=0 в тестовый файл. Новый пример функции GenerateKey предоставляет простой в использовании стандартный 2048-битный тестовый ключ.

Теперь безопасно и эффективнее вызывать PrivateKey.Precompute перед PrivateKey.Validate. Precompute теперь работает быстрее в случае частично заполненных PrecomputedValues, например, при десериализации ключа из JSON.

Пакет теперь отклоняет больше недопустимых ключей, даже если Validate не вызывается, и GenerateKey может возвращать новые ошибки для неправильно работающих источников случайных чисел. Поля Primes и Precomputed структуры PrivateKey теперь используются и проверяются даже тогда, когда некоторые значения отсутствуют. См. также изменения в анализе и сериализации RSA ключей в пакете crypto/x509 описанные ниже.

SignPKCS1v15 и VerifyPKCS1v15 теперь поддерживают SHA-512/224, SHA-512/256 и SHA-3.

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

Операции с открытыми и закрытыми ключами теперь выполняются до двух раз быстрее в среде wasm.

crypto/sha1

Значение, возвращаемое функцией sha1.New, теперь также реализует интерфейс encoding.BinaryAppender.

crypto/sha256

Значения, возвращаемые функциями sha256.New и sha256.New224, теперь также реализуют интерфейс encoding.BinaryAppender.

crypto/sha512

Значения, возвращаемые функциями sha512.New, sha512.New384, sha512.New512_224 и sha512.New512_256, теперь также реализуют интерфейс encoding.BinaryAppender.

crypto/subtle

Новая функция WithDataIndependentTiming позволяет пользователю запускать функцию с включенными архитектурно-специфичными возможностями, гарантирующими, что определенные инструкции не зависят от значений данных по времени выполнения. Это может использоваться для того, чтобы убедиться, что код, предназначенный для выполнения в постоянное время, не оптимизируется функциями CPU, которые могут привести к переменному времени выполнения. В настоящее время WithDataIndependentTiming использует бит PSTATE.DIT в arm64 и является пустой операцией на всех других архитектурах. Настройка GODEBUG dataindependenttiming=1 включает режим DIT для всего Go-программы.

Выходные данные функции XORBytes должны либо полностью совпадать с входными данными, либо не перекрываться вообще. Ранее поведение было не определено, а теперь функция XORBytes будет вызывать панику.

crypto/tls

Сервер TLS теперь поддерживает Encrypted Client Hello (ECH). Эта функция может быть включена путём заполнения поля Config.EncryptedClientHelloKeys.

Новая постквантовая механика обмена ключами X25519MLKEM768 теперь поддерживается и включена по умолчанию, когда поле Config.CurvePreferences равно nil. Настройка GODEBUG tlsmlkem=0 откатывает это поведение по умолчанию. Это может быть полезно при работе с некорректно работающими TLS-серверами, которые не могут корректно обрабатывать большие записи, вызывая таймаут во время рукопожатия (см. TLS post-quantum TL;DR fail).

Поддержка экспериментального механизма обмена ключами X25519Kyber768Draft00 была удалена.

Порядок обмена ключами теперь полностью обрабатывается пакетом crypto/tls. Порядок Config.CurvePreferences теперь игнорируется, и содержимое используется только для определения, какие механизмы обмена ключами включить, когда поле заполнено.

Новое поле ClientHelloInfo.Extensions перечисляет идентификаторы расширений, полученных в сообщении Client Hello. Это может быть полезно для создания отпечатков TLS-клиентов.

crypto/x509

Настройка GODEBUG x509sha1 была удалена. Функция Certificate.Verify больше не поддерживает подписи на основе SHA-1.

Тип OID теперь реализует интерфейсы encoding.BinaryAppender и encoding.TextAppender.

Поле политик сертификатов по умолчанию изменилось с Certificate.PolicyIdentifiers на Certificate.Policies. При разборе сертификатов оба поля будут заполнены, но при создании сертификатов политики будут теперь браться из поля Certificate.Policies, а не из Certificate.PolicyIdentifiers. Это изменение может быть отменено с помощью настройки GODEBUG x509usepolicies=0.

Функция CreateCertificate теперь генерирует номер сертификата с использованием метода, соответствующего RFC 5280, когда передается шаблон с nil полем Certificate.SerialNumber, вместо того чтобы завершаться ошибкой.

Функция Certificate.Verify теперь поддерживает проверку политик, как определено в RFC 5280 и RFC 9618. Новое поле VerifyOptions.CertificatePolicies может быть установлено в допустимое множество идентификаторов политик в формате OID. Только цепочки сертификатов с корректными графами политик будут возвращены из Certificate.Verify.

Функция MarshalPKCS8PrivateKey теперь возвращает ошибку вместо того, чтобы сериализовать некорректный RSA-ключ. (MarshalPKCS1PrivateKey не возвращает ошибку, и её поведение при передаче некорректных ключей остаётся не определённым.)

ParsePKCS1PrivateKey и ParsePKCS8PrivateKey теперь используют и проверяют закодированные значения CRT, поэтому могут отклонять недопустимые ключи RSA, которые ранее были приняты. Используйте настройку GODEBUG x509rsacrt=0, чтобы вернуться к повторному вычислению значений CRT.

debug/elf

Пакет debug/elf добавляет поддержку обработки версий символов в динамических ELF (Executable and Linkable Format) файлах. Новый метод File.DynamicVersions возвращает список динамических версий, определённых в ELF файле. Новый метод File.DynamicVersionNeeds возвращает список динамических версий, необходимых для этого ELF файла, которые определены в других ELF объектах. Наконец, новые поля Symbol.HasVersion и Symbol.VersionIndex указывают версию символа.

encoding

Были представлены два новых интерфейса: TextAppender и BinaryAppender, предназначенные для добавления текстового или двоичного представления объекта в срез байтов. Эти интерфейсы предоставляют ту же функциональность, что и TextMarshaler и BinaryMarshaler, но вместо выделения нового среза каждый раз, они добавляют данные непосредственно в существующий срез. Эти интерфейсы теперь реализованы типами стандартной библиотеки, которые уже реализовывали TextMarshaler и/или BinaryMarshaler.

encoding/json

При маршалинге, поле структуры с новой опцией omitzero в теге поля структуры будет опущено, если его значение равно нулю. Если тип поля имеет метод IsZero() bool, он будет использоваться для определения, является ли значение нулевым. В противном случае, значение считается нулевым, если оно нулевое значение для его типа. Тег поля omitzero более ясен и менее подвержен ошибкам, чем omitempty, когда намерение — опустить нулевые значения. В частности, в отличие от omitempty, omitzero опускает нулевые значения time.Time, что является распространённой причиной трудностей.

Если указаны оба тега omitempty и omitzero, поле будет опущено, если значение является пустым или нулевым (или и тем, и другим).

UnmarshalTypeError.Field теперь включает вложенные структуры, чтобы предоставить более подробные сообщения об ошибках.

go/types

Все структуры данных пакета go/types, которые предоставляют последовательности с помощью пары методов, таких как Len() int и At(int) T, теперь также имеют методы, возвращающие итераторы, что позволяет упростить код, например:

<code>params := fn.Type.(*types.Signature).Params()
for i := 0; i < params.Len(); i++ {
  use(params.At(i))
}
</code>

до следующего:

<code>for param := range fn.Signature().Params().Variables() {
  use(param)
}
</code>

Методы: Interface.EmbeddedTypes, Interface.ExplicitMethods, Interface.Methods, MethodSet.Methods, Named.Methods, Scope.Children, Struct.Fields, Tuple.Variables, TypeList.Types, TypeParamList.TypeParams, Union.Terms.

hash/adler32

Значение, возвращаемое функцией New, теперь также реализует интерфейс encoding.BinaryAppender.

hash/crc32

Значения, возвращаемые функциями New и NewIEEE, теперь также реализуют интерфейс encoding.BinaryAppender.

hash/crc64

Значение, возвращаемое функцией New, теперь также реализует интерфейс encoding.BinaryAppender.

hash/fnv

Значения, возвращаемые функциями New32, New32a, New64, New64a, New128 и New128a, теперь также реализуют интерфейс encoding.BinaryAppender.

hash/maphash

Новые функции Comparable и WriteComparable могут вычислять хэш любого сравнимого значения. Это позволяет хэшировать всё, что может использоваться в качестве ключа в карте Go.

log/slog

Новый DiscardHandler — это обработчик, который никогда не включён и всегда отбрасывает свой вывод.

Типы Level и LevelVar теперь реализуют интерфейс encoding.TextAppender.

math/big

Типы Float, Int и Rat теперь реализуют интерфейс encoding.TextAppender.

math/rand

Вызовы устаревшей функции Seed на верхнем уровне больше не имеют никакого эффекта. Чтобы восстановить старое поведение, используйте настройку GODEBUG randseednop=0. Для получения дополнительной информации см. предложение #67273.

math/rand/v2

Типы ChaCha8 и PCG теперь реализуют интерфейс encoding.BinaryAppender.

net

ListenConfig теперь по умолчанию использует MPTCP на системах, где он поддерживается (на данный момент только на Linux).

Тип IP теперь реализует интерфейс encoding.TextAppender.

net/http

Ограничение Transport на количество 1xx информационных ответов, полученных в ответ на запрос, было изменено. Ранее запрос прерывался и возвращался ошибка после получения более чем 5 1xx ответов. Теперь ошибка возвращается, если общий размер всех 1xx ответов превышает настройку Transport.MaxResponseHeaderBytes.

Кроме того, когда запрос имеет net/http/httptrace.ClientTrace.Got1xxResponse перехватчик трассировки, теперь отсутствует ограничение на общее количество ответов 1xx. Инструкция Got1xxResponse может возвращать ошибку для прерывания запроса.

Transport и Server теперь имеют поле HTTP2, которое позволяет настраивать параметры протокола HTTP/2.

Новые поля Server.Protocols и Transport.Protocols обеспечивают простой способ настройки используемых сервером или клиентом протоколов HTTP.

Сервер и клиент могут быть настроены для поддержки незашифрованных соединений HTTP/2.

Когда Server.Protocols содержит UnencryptedHTTP2, сервер будет принимать соединения HTTP/2 на незашифрованных портах. Сервер может принимать как HTTP/1, так и незашифрованный HTTP/2 на одном и том же порту.

Когда Transport.Protocols содержит UnencryptedHTTP2 и не содержит HTTP1, транспорт будет использовать незашифрованный HTTP/2 для URL-адресов http://. Если транспорт настроен на использование как HTTP/1, так и незашифрованного HTTP/2, он будет использовать HTTP/1.

Поддержка незашифрованного HTTP/2 использует «HTTP/2 с предварительным знанием» (RFC 9113, раздел 3.3). Устаревший заголовок «Upgrade: h2c» не поддерживается.

net/netip

Addr, AddrPort и Prefix теперь реализуют интерфейсы encoding.BinaryAppender и encoding.TextAppender.

net/url

URL теперь также реализует интерфейс encoding.BinaryAppender.

os/user

В Windows, Current теперь может использоваться в Windows Nano Server. Реализация была обновлена для избегания использования функций из библиотеки NetApi32, которая недоступна в Nano Server.

В Windows, Current, Lookup и LookupId теперь поддерживают следующие встроенные учетные записи служб:

В Windows, Current стал значительно быстрее при том, что текущий пользователь присоединён к медленному домену, что обычно встречается у многих корпоративных пользователей. Новая реализация теперь работает в пределах миллисекунд, в отличие от предыдущей реализации, которая могла занимать несколько секунд или даже минут для завершения.

В Windows, Current теперь возвращает владельца процесса, когда текущий поток имитирует другого пользователя. Ранее, он возвращал ошибку.

regexp

Regexp теперь реализует интерфейс encoding.TextAppender.

runtime

Функция GOROOT теперь устарела. В новом коде предпочтительно использовать системный путь для определения расположения исполняемого файла «go», и использовать go env GOROOT для нахождения его GOROOT.

strings

Пакет strings добавляет несколько функций, работающих с итераторами:

sync

Реализация sync.Map была изменена, что улучшает производительность, особенно при модификациях карты. Например, модификации непересекающихся наборов ключей теперь гораздо менее склонны к конфликтам на больших картах, а также больше не требуется время на «разогрев» для достижения низкой степени конфликтов при загрузке из карты.

Если вы столкнётесь с какими-либо проблемами, установите GOEXPERIMENT=nosynchashtriemap во время сборки, чтобы переключиться обратно на старую реализацию, и, пожалуйста, сообщите об ошибке.

testing

Новые методы T.Context и B.Context возвращают контекст, который отменяется после завершения теста и до запуска функций очистки теста.

Новые методы T.Chdir и B.Chdir могут использоваться для изменения рабочего каталога на время выполнения теста или бенчмарка.

text/template

Шаблоны теперь поддерживают итерацию по функциям и итерацию по целым числам.

time

Time теперь реализует интерфейсы encoding.BinaryAppender и encoding.TextAppender.

Платформы

Linux

Как сообщалось в заметках о выпуске Go 1.23, Go 1.24 требует ядро Linux версии 3.2 или новее.

Darwin

Go 1.24 — последний выпуск, который может работать на macOS 11 Big Sur. Go 1.25 будет требовать macOS 12 Monterey или новее.

WebAssembly

Добавлена директива компилятора go:wasmexport для программ на Go, чтобы экспортировать функции в хост WebAssembly.

В предварительной версии WebAssembly System Interface 1 (GOOS=wasip1 GOARCH=wasm), Go 1.24 поддерживает сборку программы на Go в виде reactor/library, указав флаг сборки -buildmode=c-shared.

Теперь разрешены дополнительные типы в качестве аргументов или типов результата для функций go:wasmimport. В частности, разрешены типы bool, string, uintptr и указатели на определённые типы (см. документацию для подробностей), а также 32-битные и 64-битные целочисленные и вещественные типы, а также unsafe.Pointer, которые уже были разрешены. Эти типы также разрешены в качестве аргументов или типов результата для функций go:wasmexport.

Файлы поддержки WebAssembly были перемещены из misc/wasm в lib/wasm.

Начальный размер памяти значительно уменьшен, особенно для небольших WebAssembly-приложений.

Windows

32-битная порция для Windows/arm (GOOS=windows GOARCH=arm) помечена как сломанная. См. проблему #70705 для получения подробностей.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang