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

Введение в Go 1.16

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

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

В языке не внесено никаких изменений.

Порты

Darwin и iOS

Go 1.16 добавляет поддержку 64-битной архитектуры ARM на macOS (также известной как Apple Silicon) с GOOS=darwin, GOARCH=arm64. Как и порт darwin/amd64, порт darwin/arm64 поддерживает cgo, внутреннюю и внешнюю компоновку, c-archive, c-shared, и pie режимы сборки, а также детектор гонок.

Порт iOS, который ранее был darwin/arm64, был переименован в ios/arm64. GOOS=ios подразумевает тег сборки darwin, как и GOOS=android подразумевает тег сборки linux. Это изменение должно быть прозрачным для всех, кто использует gomobile для сборки приложений iOS.

Введение GOOS=ios означает, что имена файлов вроде x_ios.go будут теперь собираться только для GOOS=ios; см. go help buildconstraint для получения подробностей. Существующие пакеты, использующие имена файлов в этом формате, должны будут переименовать файлы.

Go 1.16 добавляет порт ios/amd64, который предназначен для симулятора iOS, работающего на macOS на базе AMD64. Ранее это неофициально поддерживалось через darwin/amd64 с установленным тегом сборки ios. См. также misc/ios/README для подробностей о том, как собирать программы для iOS и симулятора iOS.

Go 1.16 — это последний выпуск, который будет работать на macOS 10.12 Sierra. Go 1.17 будет требовать macOS 10.13 High Sierra или новее.

NetBSD

Go теперь поддерживает 64-битную архитектуру ARM на NetBSD (порт netbsd/arm64).

OpenBSD

Go теперь поддерживает архитектуру MIPS64 на OpenBSD (порт openbsd/mips64). Этот порт пока не поддерживает cgo.

На 64-битных архитектурах x86 и 64-битной ARM на OpenBSD (портам openbsd/amd64 и openbsd/arm64) системные вызовы теперь выполняются через libc, вместо прямого использования инструкции SYSCALL/SVC. Это обеспечивает совместимость с будущими версиями OpenBSD. В частности, OpenBSD 6.9 и выше требуют выполнения системных вызовов через libc для нестатических бинарных файлов Go.

386

Как сообщалось в примечаниях к выпуску Go 1.15, Go 1.16 прекращает поддержку компиляции в режиме x87 (GO386=387). Поддержка процессоров без SSE2 теперь доступна с использованием режима мягкого числа (GO386=softfloat). Пользователи, работающие на процессорах без SSE2, должны заменить GO386=387 на GO386=softfloat.

RISC-V

Порт linux/riscv64 теперь поддерживает cgo и -buildmode=pie. В этом выпуске также включены оптимизации производительности и улучшения генерации кода для RISC-V.

Инструменты

Команда go

Модули

Режим, осведомлённый о модулях, включён по умолчанию, независимо от того, находится ли файл go.mod в текущем рабочем каталоге или в родительском каталоге. Точнее говоря, переменная окружения GO111MODULE теперь по умолчанию имеет значение on. Чтобы переключиться на предыдущее поведение, установите GO111MODULE в значение auto.

Команды сборки, такие как go build и go test, больше не изменяют go.mod и go.sum по умолчанию. Вместо этого они выводят ошибку, если требуется добавить или обновить требование модуля или контрольную сумму (как если бы был использован флаг -mod=readonly). Требования модулей и суммы могут быть скорректированы с помощью go mod tidy или go get.

go install теперь принимает аргументы с суффиксами версий (например, go install example.com/cmd@v1.0.0). Это приводит к тому, что go install собирает и устанавливает пакеты в режиме осведомлённости о модулях, игнорируя файл go.mod в текущем каталоге или любом родительском каталоге, если он существует. Это полезно для установки исполняемых файлов без влияния на зависимости основного модуля.

go install, с суффиксом версии или без (как описано выше), теперь является рекомендуемым способом сборки и установки пакетов в режиме модулей. Команда go get должна использоваться с флагом -d для изменения зависимостей текущего модуля без сборки пакетов, а использование go get для сборки и установки пакетов устарело. В будущем выпуске флаг -d всегда будет включён.

Директивы retract теперь могут использоваться в файле go.mod, чтобы указать, что определённые опубликованные версии модуля не должны использоваться другими модулями. Автор модуля может отозвать версию после обнаружения серьёзной проблемы или если версия была опубликована случайно.

Подкоманды go mod vendor и go mod tidy теперь принимают флаг -e, который указывает им продолжать работу несмотря на ошибки при разрешении отсутствующих пакетов.

Команда go теперь игнорирует требования к версиям модулей, исключённым директивами exclude в основном модуле. Ранее команда go использовала следующую по величине версию выше исключённой, но эта версия могла изменяться со временем, что приводило к неповторяемым сборкам.

В режиме модулей команда go теперь запрещает импортировать пути, содержащие не-ASCII символы или элементы пути с ведущей точкой (.). Пути модулей с такими символами уже были запрещены (см. Пути и версии модулей), поэтому это изменение затрагивает только пути внутри подкаталогов модулей.

Встраивание файлов

Команда go теперь поддерживает включение статических файлов и деревьев файлов в конечный исполняемый файл, используя новую директиву //go:embed. См. документацию для нового embed пакета для получения подробной информации.

go test

При использовании go test, тест, вызывающий os.Exit(0) во время выполнения функции теста, теперь будет считаться не пройденным. Это поможет выявить ситуации, в которых тест вызывает код, который в свою очередь вызывает os.Exit(0) и прекращает выполнение всех последующих тестов. Если функция TestMain вызывает os.Exit(0), это всё ещё считается успешным тестом.

go test сообщает об ошибке, когда флаги -c или -i используются вместе с неизвестными флагами. Обычно неизвестные флаги передаются тестам, но когда используются -c или -i, тесты не запускаются.

go get

Флаг go get -insecure устарел и будет удалён в будущей версии. Этот флаг позволяет получать данные из репозиториев и разрешать пользовательские домены с использованием небезопасных протоколов, таких как HTTP, а также обходит проверку суммы модуля с использованием базы данных контрольных сумм. Чтобы разрешить использование небезопасных протоколов, используйте переменную окружения GOINSECURE. Чтобы обойти проверку суммы модуля, используйте GOPRIVATE или GONOSUMDB. Подробнее см. в go help environment.

go get example.com/mod@patch теперь требует, чтобы некоторая версия example.com/mod уже была требуема основным модулем. (Однако, go get -u=patch продолжает обновлять даже недавно добавленные зависимости.)

GOVCS переменная окружения

GOVCS — новая переменная окружения, которая ограничивает использование инструментов системы управления версиями командой go для загрузки исходного кода. Это снижает потенциальные проблемы безопасности, связанные с инструментами, которые обычно используются в доверенных и аутентифицированных средах. По умолчанию, git и hg могут использоваться для загрузки кода из любого репозитория. svn, bzr и fossil могут использоваться только для загрузки кода из репозиториев, пути которых совпадают с шаблонами, указанными в переменной окружения GOPRIVATE. Подробнее см. в go help vcs.

Шаблон all

Когда в файле go.mod основного модуля объявлено go 1.16 или выше, шаблон пакетов all теперь соответствует только тем пакетам, которые транзитивно импортируются пакетом или тестом, найденным в основном модуле. (Пакеты, импортируемые тестами пакетов, импортируемых основным модулем, больше не включаются.) Это тот же набор пакетов, который сохраняется командой go mod vendor начиная с Go 1.11.

Флаг сборки -toolexec

Когда флаг сборки -toolexec задан для использования программы при вызове программ инструментария, например, компилятора или ассемблера, переменная окружения TOOLEXEC_IMPORTPATH теперь устанавливается в путь импорта пакета, который собирается.

Флаг сборки -i

Флаг -i, принимаемый командами go build, go install и go test, теперь устарел. Флаг -i указывает команде go установить пакеты, импортированные пакетами, указанными в командной строке. Поскольку кэш сборки был представлен в Go 1.10, флаг -i больше не оказывает существенного влияния на время сборки и вызывает ошибки, если каталог установки недоступен для записи.

Команда list

Когда указывается флаг -export, поле BuildID теперь устанавливается в идентификатор сборки компилируемого пакета. Это эквивалентно запуску go tool buildid на go list -exported -f {{.Export}}, но без дополнительного шага.

Флаг -overlay

Флаг -overlay указывает JSON-файл конфигурации, содержащий набор замен путей файлов. Флаг -overlay может использоваться со всеми командами сборки и подкомандами go mod. Он в первую очередь предназначен для использования инструментами редакторов, такими как gopls, чтобы понимать эффекты несохранённых изменений в исходных файлах. Файл конфигурации сопоставляет фактические пути к файлам с путями замен и команда go и её сборки будут работать так, как если бы фактические пути к файлам существовали с содержимым, указанным в путях замен, или не существовали, если пути замен пусты.

Cgo

Инструмент cgo больше не пытается преобразовывать битовые поля структур C в поля структур Go, даже если их размер может быть представлен в Go. Порядок, в котором битовые поля C располагаются в памяти, зависит от реализации, поэтому в некоторых случаях инструмент cgo выдавал результаты, которые тихо были некорректны.

Vet

Новое предупреждение о неправильном использовании testing.T в горутинах

Инструмент vet теперь предупреждает о неправильных вызовах метода testing.T Fatal внутри горутины, созданной во время теста. Это также предупреждает о вызовах методов Fatalf, FailNow и Skip{,f,Now} у тестов testing.T или бенчмарков testing.B.

Вызовы этих методов останавливают выполнение созданной горутины, а не функции Test* или Benchmark*. Поэтому эти методы должны быть вызваны горутиной, выполняющей функцию теста или бенчмарка. Например:

<code>func TestFoo(t *testing.T) {
  go func() {
    if condition() {
      t.Fatal("oops") // Это завершает внутреннюю функцию, а не TestFoo.
    }
    ...
  }()
}
</code>

Код, вызывающий t.Fatal (или аналогичный метод) из созданной горутины, следует переписать так, чтобы сигнал неудачи теста передавался с помощью t.Error, а горутина завершалась преждевременно с помощью альтернативного метода, например, с помощью оператора return. Предыдущий пример можно переписать следующим образом:

<code>func TestFoo(t *testing.T) {
  go func() {
    if condition() {
      t.Error("oops")
      return
    }
    ...
  }()
}
</code>

Новое предупреждение о указателе кадра

Инструмент vet теперь предупреждает о коде на ассемблере amd64, который перезаписывает регистр BP (указатель кадра) без его сохранения и восстановления, вопреки соглашению о вызовах. Код, который не сохраняет регистр BP, должен быть изменён так, чтобы либо вообще не использовать BP, либо сохранить BP, сохранив и восстановив его. Простой способ сохранить BP — установить размер кадра ненулевым значением, что приведёт к автоматическому сохранению регистра BP в генерируемом прологе и эпилоге. См. CL 248260 для примеров исправлений.

Новое предупреждение для asn1.Unmarshal

Инструмент vet теперь предупреждает о неправильной передаче аргумента, который не является указателем или равен nil, в asn1.Unmarshal. Это аналог существующих проверок для encoding/json.Unmarshal и encoding/xml.Unmarshal.

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

Новый пакет runtime/metrics предоставляет стабильный интерфейс для чтения метрик, определяемых реализацией, из среды выполнения Go. Он заменяет существующие функции, такие как runtime.ReadMemStats и debug.GCStats, и значительно более общий и эффективный. Подробнее см. в документации пакета.

Установка переменной окружения GODEBUG в значение inittrace=1 теперь приводит к тому, что среда выполнения выводит одну строку в стандартный поток ошибок для каждого пакета init, сводя его время выполнения и объем выделенной памяти. Этот трейс может использоваться для выявления узких мест или регрессий в производительности запуска Go. Документация по GODEBUG описывает формат.

В Linux среда выполнения теперь по умолчанию немедленно освобождает память операционной системе (используя MADV_DONTNEED), а не откладывает это действие до тех пор, пока операционная система не столкнётся с нехваткой памяти (используя MADV_FREE). Это означает, что статистика памяти на уровне процесса, такая как RSS, будет более точно отражать объём физической памяти, используемой Go-процессами. Системы, которые ранее использовали GODEBUG=madvdontneed=1 для улучшения поведения мониторинга памяти, больше не нуждаются в установке этого переменного окружения.

Go 1.16 исправляет расхождение между детектором гонок и памятной моделью Go. Детектор гонок теперь более точно следует правилам синхронизации каналов памятной модели. В результате детектор может теперь сообщать о гонках, которые ранее он не замечал.

Компилятор

Компилятор теперь может встраивать функции с for-циклами без меток, значениями методов и типами переключателей. Инлайнер также может теперь обнаруживать больше косвенных вызовов, где встраивание возможно.

Линкер

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

Изменения в линкере 1.16 расширяют улучшения 1.15 на все поддерживаемые сочетания архитектур/ОС (улучшения производительности 1.15 были в основном сосредоточены на ELF-основанных ОС и архитектурах amd64). Для репрезентативного набора крупных Go-программ процесс связывания стал на 20–25% быстрее, чем в 1.15, и требует на 5–15% меньше памяти в среднем для linux/amd64, с более значительными улучшениями для других архитектур и ОС. В результате также уменьшаются размеры большинства бинарных файлов благодаря более агрессивному удалению символов.

В Windows go build -buildmode=c-shared теперь по умолчанию генерирует DLL с ASLR. Отключение ASLR возможно с помощью --ldflags=-aslr=false.

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

Встроенные файлы

Новый пакет embed предоставляет доступ к файлам, встроенным в программу во время компиляции, с использованием нового //go:embed директивы.

Файловые системы

Новый пакет io/fs определяет интерфейс fs.FS, абстракцию для древовидных структур файлов только для чтения. Стандартные пакеты библиотеки были адаптированы для использования интерфейса по мере необходимости.

Со стороны производителя интерфейса, новый тип embed.FS реализует fs.FS, как и zip.Reader. Новая функция os.DirFS предоставляет реализацию fs.FS, основанную на дереве файлов операционной системы.

Со стороны потребителя, новая функция http.FS преобразует fs.FS в http.FileSystem. Также функции и методы ParseFS из пакетов html/template и text/template читают шаблоны из fs.FS.

Для тестирования кода, реализующего fs.FS, новый пакет testing/fstest предоставляет функцию TestFS, которая проверяет и сообщает о распространённых ошибках. Также он предоставляет простую реализацию файловой системы в памяти — MapFS, которая может быть полезна для тестирования кода, принимающего реализации fs.FS.

Устаревший пакет io/ioutil

Пакет io/ioutil оказался плохо определённой и трудной для понимания коллекцией вещей. Вся функциональность, предоставленная этим пакетом, была перемещена в другие пакеты. Пакет io/ioutil остаётся и продолжает работать как раньше, но мы рекомендуем новому коду использовать новые определения в пакетах io и os. Ниже приведён список новых местоположений имён, экспортируемых из io/ioutil:

Минорные изменения в библиотеке

Как и всегда, в библиотеке были внесены различные минорные изменения и обновления, сделанные с учётом обещания совместимости Go 1.

archive/zip

Новый метод Reader.Open реализует интерфейс fs.FS.

crypto/dsa

Пакет crypto/dsa теперь устарел. См. issue #40337.

crypto/hmac

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

crypto/tls

Операции ввода-вывода на закрываемых или закрытых TLS-соединениях теперь могут быть обнаружены с использованием нового ошибочного значения net.ErrClosed. Типичное применение: errors.Is(err, net.ErrClosed).

По умолчанию теперь устанавливается дедлайн записи в Conn.Close перед отправкой уведомления о закрытии, чтобы предотвратить бесконечное блокирование.

Клиенты теперь возвращают ошибку рукопожатия, если сервер выбирает протокол ALPN, которого не было в списке, объявленном клиентом, через NextProtos.

Серверы теперь будут предпочитать другие доступные AEAD наборы шифров (например, ChaCha20Poly1305) наборам шифров AES-GCM, если клиент или сервер не имеют аппаратной поддержки AES, если только не установлены оба параметра Config.PreferServerCipherSuites и Config.CipherSuites. Клиент считается не имеющим аппаратной поддержки AES, если он не указывает предпочтение для наборов шифров AES-GCM.

Config.Clone теперь возвращает nil, если получатель равен nil, вместо того чтобы паниковать.

crypto/x509

Флаг GODEBUG=x509ignoreCN=0 будет удалён в Go 1.17. Он включает устаревшее поведение, при котором поле CommonName в сертификатах X.509 рассматривается как имя хоста, если альтернативные имена субъекта отсутствуют.

ParseCertificate и CreateCertificate теперь проверяют ограничения кодировки строк для полей DNSNames, EmailAddresses и URIs. Эти поля могут содержать только строки с символами в диапазоне ASCII.

CreateCertificate теперь проверяет подпись сгенерированного сертификата с использованием открытого ключа подписавшего его лица. Если подпись недействительна, возвращается ошибка, вместо того чтобы создаваться некорректный сертификат.

Проверка подписей DSA больше не поддерживается. Обратите внимание, что генерация подписей DSA никогда не поддерживалась. См. issue #40337.

В Windows, Certificate.Verify теперь возвращает все цепочки сертификатов, построенные платформенным верификатором сертификатов, вместо того чтобы возвращать только самую высокую по рангу цепочку.

Новый метод SystemRootsError.Unwrap позволяет получить доступ к полю Err через функции пакета errors.

В Unix-системах, пакет crypto/x509 теперь более эффективно хранит свою копию пула системных сертификатов. Программы, использующие только небольшое количество корневых сертификатов, будут использовать примерно на полмегабайта меньше памяти.

debug/elf

Добавлены дополнительные константы DT и PT.

encoding/asn1

Unmarshal и UnmarshalWithParams теперь возвращают ошибку вместо паники, если аргумент не является указателем или равен nil. Это изменение соответствует поведению других пакетов кодирования, таких как encoding/json.

encoding/json

Поля структуры json, понимаемые Marshal, Unmarshal и связанными функциями, теперь разрешают использование символа точки с запятой внутри имени JSON-объекта для поля Go-структуры.

encoding/xml

Кодировщик всегда следил за тем, чтобы не использовать префиксы пространств имён, начинающиеся с xml, которые зарезервированы спецификацией XML. Теперь, следуя спецификации более строго, эта проверка выполняется без учёта регистра, так что префиксы, начинающиеся с XML, XmL и т. д., также избегаются.

flag

Новая функция Func позволяет зарегистрировать флаг, реализованный вызовом функции, как более лёгковесную альтернативу реализации интерфейса Value.

go/build

Структура Package имеет новые поля, которые сообщают информацию о директивах //go:embed в пакете: EmbedPatterns, EmbedPatternPos, TestEmbedPatterns, TestEmbedPatternPos, XTestEmbedPatterns, XTestEmbedPatternPos.

Поле Package IgnoredGoFiles больше не будет включать файлы, начинающиеся с “_” или “.”, так как такие файлы всегда игнорируются. IgnoredGoFiles предназначено для файлов, игнорируемых из-за ограничений сборки.

Новое поле Package IgnoredOtherFiles содержит список не-Go файлов, игнорируемых из-за ограничений сборки.

go/build/constraint

Новый пакет go/build/constraint разбирает строки ограничений сборки, как исходный синтаксис // +build, так и синтаксис //go:build, который будет представлен в Go 1.17. Этот пакет существует для того, чтобы инструменты, созданные с использованием Go 1.16, могли обрабатывать исходный код Go 1.17. См. https://golang.org/design/draft-gobuild для получения подробной информации о синтаксисах ограничений сборки и запланированного перехода к синтаксису //go:build. Обратите внимание, что строки //go:build не поддерживаются в Go 1.16 и ещё не должны использоваться в программах на Go.

html/template

Новая функция template.ParseFS и метод template.Template.ParseFS похожи на template.ParseGlob и template.Template.ParseGlob, но читают шаблоны из fs.FS.

io

Пакет теперь определяет интерфейс ReadSeekCloser.

Пакет теперь определяет Discard, NopCloser и ReadAll, которые следует использовать вместо одноимённых функций из пакета io/ioutil.

log

Новая функция Default предоставляет доступ к стандартному Logger.

log/syslog

Writer теперь использует локальный формат сообщений (опуская имя хоста и используя более короткую метку времени) при записи в пользовательские сокеты домена Unix, соответствуя формату, уже используемому для стандартного лог-сокета.

mime/multipart

Метод ReadForm у Reader больше не отклоняет данные формы, если передать максимальное значение int64 в качестве лимита.

net

Случай ввода-вывода по закрытому сетевому соединению или ввода-вывода по сетевому соединению, которое закрывается до завершения любого из операций ввода-вывода, теперь может быть обнаружен с использованием нового ErrClosed ошибки. Типичное использование: errors.Is(err, net.ErrClosed). В более ранних версиях Go единственным надежным способом обнаружения такого случая было сопоставление строки, возвращаемой методом Error, со строкой "use of closed network connection".

В предыдущих версиях Go размер очереди ожидания TCP-слушателя на системах Linux, устанавливаемый через /proc/sys/net/core/somaxconn, был ограничен максимумом 65535. В ядрах Linux версии 4.1 и выше максимальное значение теперь составляет 4294967295.

В Linux поиск имени хоста больше не использует DNS перед проверкой /etc/hosts, если отсутствует /etc/nsswitch.conf; это распространено в системах на базе musl и делает поведение программ на Go совместимым с поведением программ на C в этих системах.

net/http

В пакете net/http поведение StripPrefix было изменено так, чтобы удалять префикс из поля RawPath URL-запроса в дополнение к полю Path. В предыдущих версиях Go только поле Path обрезалось, и поэтому, если URL-запрос содержал экранированные символы, URL изменялся так, что поля Path и RawPath не совпадали. В Go 1.16 StripPrefix обрезает оба поля. Если в префиксе URL-запроса есть экранированные символы, обработчик возвращает код 404, вместо того чтобы вызывать базовый обработчик с несоответствующей парой Path/RawPath.

Пакет net/http теперь отклоняет HTTP-запросы диапазонов вида "Range": "bytes=--N", где "-N" — отрицательная длина суффикса, например "Range": "bytes=--2". Теперь он отвечает 416 "Range Not Satisfiable".

Куки, установленные с помощью SameSiteDefaultMode, теперь ведут себя согласно текущей спецификации (атрибут не устанавливается), вместо того чтобы генерировать ключ SameSite без значения.

Client теперь отправляет явный заголовок Content-Length: 0 в PATCH-запросах с пустым телом, соответствуя существующему поведению POST и PUT.

Функция ProxyFromEnvironment больше не возвращает значение переменной окружения HTTP_PROXY для URL-адресов https://, если переменная HTTPS_PROXY не установлена.

Тип Transport имеет новое поле GetProxyConnectHeader, которое может быть установлено в функцию, возвращающую заголовки для отправки прокси во время запроса CONNECT. По сути, GetProxyConnectHeader является динамической версией существующего поля ProxyConnectHeader; если GetProxyConnectHeader не равен nil, то ProxyConnectHeader игнорируется.

Новая функция http.FS преобразует fs.FS в http.FileSystem.

net/http/httputil

ReverseProxy теперь более агрессивно сбрасывает буферизованные данные при проксировании потоковых ответов с неизвестной длиной тела.

net/smtp

Метод Client Mail теперь отправляет директиву SMTPUTF8 серверам, которые её поддерживают, сигнализируя, что адреса закодированы в UTF-8.

os

Process.Signal теперь возвращает ErrProcessDone вместо неэкспортируемой errFinished, если процесс уже завершён.

Пакет определяет новый тип DirEntry как псевдоним для fs.DirEntry. Новая функция ReadDir и новый метод File.ReadDir могут использоваться для чтения содержимого каталога в срез DirEntry. Метод File.Readdir (обратите внимание на строчную букву d в dir) по-прежнему существует и возвращает срез FileInfo, но для большинства программ будет более эффективно перейти на File.ReadDir.

Пакет теперь определяет CreateTemp, MkdirTemp, ReadFile и WriteFile, которые следует использовать вместо функций, определённых в пакете io/ioutil.

Типы FileInfo, FileMode и PathError теперь являются псевдонимами для типов с тем же именем в пакете io/fs. Сигнатуры функций в пакете os были обновлены для ссылки на имена в пакете io/fs. Это не должно повлиять на существующий код.

Новая функция DirFS предоставляет реализацию fs.FS, основанную на дереве файлов операционной системы.

os/signal

Новая функция NotifyContext позволяет создавать контексты, отменяемые при получении определённых сигналов.

path

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

path/filepath

Новая функция WalkDir похожа на Walk, но обычно более эффективна. Функция, передаваемая в WalkDir, получает fs.DirEntry вместо fs.FileInfo. (Чтобы прояснить для тех, кто помнит функцию Walk как принимающую os.FileInfo, os.FileInfo теперь является псевдонимом для fs.FileInfo.)

Функции Match и Glob теперь возвращают ошибку, если неподходящая часть шаблона содержит синтаксическую ошибку. Ранее функции возвращали результат преждевременно при неудачном совпадении, и, следовательно, не сообщали о последующих синтаксических ошибках в шаблоне.

reflect

Функция Zero была оптимизирована для избежания выделений. Код, который некорректно сравнивает возвращаемое значение Value с другим значением Value с помощью == или DeepEqual, может получить другие результаты, чем те, что были в предыдущих версиях Go. Документация для reflect.Value описывает, как правильно сравнивать два Value.

runtime/debug

Значения runtime.Error, используемые при включённой функции SetPanicOnFault, теперь могут иметь метод Addr. Если этот метод существует, он возвращает адрес памяти, который вызвал сбой.

strconv

ParseFloat теперь использует алгоритм Эйзеля-Лемира, что улучшает производительность до коэффициента 2. Это также может ускорить декодирование текстовых форматов, таких как encoding/json.

syscall

NewCallback и NewCallbackCDecl теперь корректно поддерживают функции обратного вызова с несколькими под-uintptr-размерными аргументами подряд. Это может потребовать изменения использования этих функций для удаления ручного заполнения между маленькими аргументами.

SysProcAttr в Windows имеет новое поле NoInheritHandles, которое отключает наследование дескрипторов при создании нового процесса.

DLLError в Windows теперь имеет метод Unwrap для раскрытия внутренней ошибки.

В Linux, Setgid, Setuid и связанные вызовы теперь реализованы. Ранее они возвращали ошибку syscall.EOPNOTSUPP.

В Linux новые функции AllThreadsSyscall и AllThreadsSyscall6 могут быть использованы для выполнения системного вызова на всех Go горутинах в процессе. Эти функции могут быть использованы только программами, которые не используют cgo; если программа использует cgo, они всегда возвращают syscall.ENOTSUP.

testing/iotest

Новая функция ErrReader возвращает io.Reader, который всегда возвращает ошибку.

Новая функция TestReader тестирует, что io.Reader поведение корректно.

text/template

Символы новой строки теперь разрешены внутри ограничителей действий, что позволяет действиям занимать несколько строк.

Новая функция template.ParseFS и метод template.Template.ParseFS похожи на template.ParseGlob и template.Template.ParseGlob, но читают шаблоны из fs.FS.

text/template/parse

В дерево разбора добавлен новый CommentNode. Поле Mode в parse.Tree позволяет получить к нему доступ.

time/tzdata

Упрощённый формат данных о часовых поясах теперь используется для базы данных часовых поясов в $GOROOT/lib/time/zoneinfo.zip и во встроенной копии этого пакета. Это уменьшает размер базы данных часовых поясов примерно на 350 КБ.

unicode

Пакет unicode и соответствующая поддержка по всей системе были обновлены с Unicode 12.0.0 до Unicode 13.0.0, что добавляет 5 930 новых символов, включая четыре новых письменности, и 55 новых эмодзи. Unicode 13.0.0 также обозначает плоскость 3 (U+30000-U+3FFFF) как третичную иероглифическую плоскость.

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

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