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

Введение в Go 1.13

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

Начиная с Go 1.13, команда go по умолчанию загружает и проверяет подлинность модулей, используя зеркало Go-модулей и базу данных контрольных сумм, управляемые Google. См. https://proxy.golang.org/privacy для получения информации о конфиденциальности этих сервисов и документацию команды go для получения сведений о настройке, включая то, как отключить использование этих серверов или использовать другие. Если вы полагаетесь на непубличные модули, см. документацию по настройке вашей среды.

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

Согласно предложению о литералах чисел, Go 1.13 поддерживает более унифицированный и современный набор префиксов литералов чисел.

  • Двоичные целочисленные литералы: Префикс 0b или 0B обозначает двоичный целочисленный литерал, например, 0b1011.
  • Восьмеричные целочисленные литералы: Префикс 0o или 0O обозначает восьмеричный целочисленный литерал, например, 0o660. Существующая восьмеричная нотация, обозначаемая ведущим 0, за которым следуют восьмеричные цифры, остаётся действительной.
  • Шестнадцатеричные литералы с плавающей точкой: Префикс 0x или 0X теперь может использоваться для выражения мантиссы числа с плавающей точкой в шестнадцатеричном формате, например, 0x1.0p-1021. Шестнадцатеричное число с плавающей точкой всегда должно иметь экспоненту, записанную как буква p или P, за которой следует экспонента в десятичном формате. Экспонента масштабирует мантиссу на 2 в степени экспоненты.
  • Мнимые литералы: Мнимая суффиксная буква i теперь может использоваться с любым (двоичным, десятичным, шестнадцатеричным) целочисленным или литералом с плавающей точкой.
  • Разделители цифр: Цифры любого литерала числа теперь могут быть разделены (группированы) с помощью символа подчёркивания, например, в 1_000_000, 0b_1010_0110 или 3.1415_9265. Символ подчёркивания может находиться между любыми двумя цифрами или между префиксом литерала и первой цифрой.

Согласно предложению по знаковым сдвигам, Go 1.13 удаляет ограничение, согласно которому сдвиг должен быть беззнаковым. Это изменение устраняет необходимость во многих искусственных преобразованиях типа uint, которые были введены исключительно для удовлетворения (теперь удаленного) ограничения операторов << и >>.

Эти изменения языка были реализованы за счёт изменений в компиляторе и соответствующих внутренних изменений в библиотечных пакетах go/scanner и text/scanner (литералы чисел), а также go/types (знаковые сдвиги).

Если ваш код использует модули и в файле go.mod указана версия языка, убедитесь, что она установлена как минимум на 1.13, чтобы получить доступ к этим изменениям языка. Вы можете сделать это, отредактировав файл go.mod напрямую, или выполнив команду go mod edit -go=1.13.

Порты

Go 1.13 — последний релиз, который будет работать в Native Client (NaCl).

Для GOARCH=wasm новая переменная окружения GOWASM принимает список экспериментальных возможностей, разделённых запятыми, с которыми компилируется бинарный файл. Допустимые значения документированы здесь.

AIX

Поддержка AIX на PPC64 (aix/ppc64) теперь включает cgo, внешнюю компоновку и режимы сборки c-archive и pie.

Android

Программы на Go теперь совместимы с Android 10.

Darwin

Как было объявлено в заметках о релизе Go 1.12, Go 1.13 теперь требует macOS 10.11 El Capitan или новее; поддержка предыдущих версий прекращена.

FreeBSD

Как было объявлено в заметках о релизе Go 1.12, Go 1.13 теперь требует FreeBSD 11.2 или новее; поддержка предыдущих версий прекращена. FreeBSD 12.0 или новее требует ядро с включённой опцией COMPAT_FREEBSD11 (по умолчанию эта опция включена).

Illumos

Go теперь поддерживает Illumos с GOOS=illumos. Тег сборки illumos подразумевает тег solaris.

Windows

Версия Windows, указанная во внутренне связываемых бинарных файлах Windows, теперь соответствует Windows 7 вместо NT 4.0. Это уже было минимально необходимой версией для Go, но может повлиять на поведение системных вызовов, которые имеют режим обратной совместимости. Такие вызовы теперь будут вести себя согласно документации. Внешне связываемые бинарные файлы (любая программа, использующая cgo) всегда указывали более новую версию Windows.

Инструменты

Модули

Переменные окружения

Переменная окружения GO111MODULE по-прежнему по умолчанию имеет значение auto, но теперь настройка auto активирует режим, осведомлённый о модулях, в команде go, когда текущий рабочий каталог содержит, или находится ниже каталога, содержащего файл go.mod — даже если текущий каталог находится внутри GOPATH/src. Это изменение упрощает миграцию существующего кода внутри GOPATH/src и непрерывную поддержку пакетов, осведомлённых о модулях, вместе с импортерами, не осведомлёнными о модулях.

Новая переменная окружения GOPRIVATE указывает пути модулей, которые недоступны публично. Она служит значением по умолчанию для более низкоуровневых переменных GONOPROXY и GONOSUMDB, которые обеспечивают более точный контроль над тем, какие модули извлекаются через прокси и проверяются с использованием базы данных контрольных сумм.

Переменная окружения GOPROXY может теперь быть установлена в виде списка URL прокси, разделённых запятыми, или специального токена direct, и ее значение по умолчанию теперь равно https://proxy.golang.org,direct. При разрешении пути пакета до содержащего его модуля команда go попробует все возможные пути модулей на каждом прокси из списка по очереди. Недоступный прокси или HTTP-статусный код, отличный от 404 или 410, завершает поиск без обращения к остальным прокси.

Новая переменная окружения GOSUMDB определяет имя, а также необязательно открытый ключ и URL сервера, базы данных, которую следует использовать для проверки контрольных сумм модулей, которые ещё не включены в файл go.sum основного модуля. Если GOSUMDB не содержит явного URL, то URL выбирается путём проверки URL-адресов GOPROXY на наличие конечной точки, указывающей на поддержку базы данных контрольных сумм, и возвращается к прямому подключению к указанной базе данных, если она не поддерживается ни одним из прокси. Если GOSUMDB установлено в значение off, база данных контрольных сумм не используется, и проверяются только существующие контрольные суммы в файле go.sum.

Пользователи, которые не могут получить доступ к прокси и базе данных контрольных сумм по умолчанию (например, из-за настройки брандмауэра или песочницы), могут отключить их использование, установив GOPROXY в значение direct, и/или GOSUMDB в значение off. go env -w может использоваться для установки значений по умолчанию для этих переменных независимо от платформы:

<code>go env -w GOPROXY=direct
go env -w GOSUMDB=off
</code>

go get

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

В частности, обратите внимание, что go get -u (без дополнительных аргументов) теперь обновляет только транзитивные импорты пакета, находящегося в текущем каталоге. Чтобы вместо этого обновить все пакеты, транзитивно импортируемые главным модулем (включая тестовые зависимости), используйте go get -u all.

В результате вышеуказанных изменений в go get -u, подкоманда go get больше не поддерживает флаг -m, который вызывал остановку go get до загрузки пакетов. Флаг -d по-прежнему поддерживается и продолжает вызывать остановку go get после загрузки исходного кода, необходимого для построения зависимостей указанных пакетов.

По умолчанию, go get -u в режиме модулей обновляет только не-тестовые зависимости, как в режиме GOPATH. Теперь она также принимает флаг -t, который (как и в режиме GOPATH) вызывает включение пакетов, импортируемых тестами пакетов, указанных в командной строке.

В режиме работы с модулями подкоманда go get теперь поддерживает суффикс версии @patch. Суффикс @patch указывает, что указанный модуль или модуль, содержащий указанный пакет, должен быть обновлён до последней патч-версии с теми же основной и дополнительной версиями, что и версия, найденная в списке сборки.

Если модуль, переданный в качестве аргумента команде go get без суффикса версии, уже требуется в более новой версии, чем последняя опубликованная версия, он останется в более новой версии. Это согласуется с поведением флага -u для зависимостей модулей. Это предотвращает неожиданные понижения с предрелизных версий. Новый суффикс версии @upgrade явно запрашивает такое поведение. @latest явно запрашивает последнюю версию независимо от текущей версии.

Проверка версии

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

Аннотация версии +incompatible обходит требование семантического версионирования импортов для репозиториев, которые существуют до введения модулей. Команда go теперь проверяет, что такая версия не включает явного файла go.mod.

Команда go теперь проверяет соответствие между псевдо-версиями и метаданными системы контроля версий. А именно:

Если директива require в основном модуле использует недопустимую псевдо-версию, её обычно можно исправить, убрав версию и оставив только хэш коммита, а затем снова запустив команду go, например go list -m all или go mod tidy. Например,

<code>require github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c
</code>

можно упростить до

<code>require github.com/docker/docker e7b5f7dbe98c
</code>

которая в настоящее время разрешается в

<code>require github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c
</code>

Если одна из транзитивных зависимостей основного модуля требует недопустимой версии или псевдо-версии, недопустимую версию можно заменить допустимой с помощью директивы replace в файле go.mod основного модуля. Если замена — это хэш коммита, он будет разрешён в соответствующую псевдо-версию, как описано выше. Например,

<code>replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker e7b5f7dbe98c
</code>

в настоящее время разрешается в

<code>replace github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c => github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c
</code>

Команда go

Команда go env теперь принимает флаг -w для установки пользовательского значения переменной окружения, распознаваемой командой go, и соответствующий флаг -u для сброса ранее установленного значения. Значения по умолчанию, установленные через go env -w, сохраняются в файле go/env внутри os.UserConfigDir().

Команда go version теперь принимает аргументы, указывающие на исполняемые файлы и каталоги. При запуске на исполняемом файле, go version выводит версию Go, использованную для его сборки. Если используется флаг -m, go version выводит информацию о встроенной в исполняемый файл версии модуля, если она доступна. При запуске на каталоге, go version выводит информацию об исполняемых файлах, содержащихся в этом каталоге и его подкаталогах.

Новый go build флаг -trimpath удаляет все пути файловой системы из скомпилированного исполняемого файла, чтобы повысить воспроизводимость сборки.

Если флаг -o, передаваемый в go build, указывает на существующий каталог, go build теперь записывает исполняемые файлы в этот каталог для main пакетов, соответствующих аргументам пакетов.

Флаг go build -tags теперь принимает список тегов сборки, разделённых запятыми, чтобы позволить использовать несколько тегов в GOFLAGS. Формат с пробелами устарел, но всё ещё распознаётся и будет поддерживаться.

go generate теперь устанавливает тег сборки generate, чтобы файлы могли быть просканированы на наличие директив, но игнорировались при сборке.

Как сообщалось в примечаниях к выпуску Go 1.12, пакеты с бинарным кодом больше не поддерживаются. Сборка пакета с бинарным кодом (отмеченного комментарием //go:binary-only-package) теперь приводит к ошибке.

Компилятор

Компилятор имеет новую реализацию анализа утечек памяти, которая более точна. Для большинства программ на Go это должно быть улучшением (иными словами, больше переменных и выражений Go выделяется на стеке вместо кучи). Однако, эта повышенная точность может также сломать некорректный код, который раньше работал (например, код, нарушающий unsafe.Pointer правила безопасности). Если вы заметили какие-либо регрессии, связанные с этим, старый анализ утечек можно снова включить с помощью go build -gcflags=all=-newescape=false. Опция использования старого анализа утечек будет удалена в будущем выпуске.

Компилятор больше не выводит числовые константы с плавающей точкой или комплексные константы в файлы go_asm.h. Они всегда выводились в форме, которую нельзя было использовать как числовую константу в ассемблерном коде.

Ассемблер

Ассемблер теперь поддерживает множество атомарных инструкций, представленных в ARM v8.1.

gofmt

gofmt (и соответственно go fmt) теперь приводит префиксы и показатели степени числовых литералов к нижнему регистру, но оставляет шестнадцатеричные цифры без изменений. Это улучшает читаемость при использовании нового восьмеричного префикса (0O становится 0o), и изменение применяется последовательно. gofmt теперь также удаляет избыточные ведущие нули из мнимого литерала десятичного целого числа. (Для обратной совместимости мнимый литерал целого числа, начинающийся с 0, считается десятичным, а не восьмеричным числом. Удаление лишних ведущих нулей избегает потенциальной путаницы.) Например, 0B1010, 0XabcDEF, 0O660, 1.2E3, и 01i становятся 0b1010, 0xabcDEF, 0o660, 1.2e3, и 1i после применения gofmt.

godoc и go doc

Веб-сервер godoc больше не включён в основную двоичную сборку. Чтобы запустить локально веб-сервер godoc, сначала вручную установите его:

<code>go get golang.org/x/tools/cmd/godoc
godoc
</code>

Команда go doc теперь всегда включает в вывод пакетную инструкцию, за исключением команд. Это заменяет предыдущее поведение, при котором использовалась эвристика, из-за которой пакетная инструкция могла быть опущена при определённых условиях.

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

Сообщения о панике при выходе за пределы диапазона теперь включают индекс, который вышел за пределы, и длину (или ёмкость) среза. Например, s[3] на срезе длиной 1 вызовет панику с сообщением «runtime error: index out of range [3] with length 1».

В этом выпуске улучшена производительность большинства случаев использования defer на 30%.

Среда выполнения теперь более агрессивно возвращает память операционной системе, чтобы сделать её доступной для других приложений. Ранее среда выполнения могла удерживать память в течение пяти минут и более после скачка размера кучи. Теперь она начинает возвращать её немедленно после уменьшения кучи. Однако, во многих операционных системах, включая Linux, сама ОС лениво освобождает память, поэтому объём RSS процесса не будет уменьшаться, пока система не окажется под давлением памяти.

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

TLS 1.3

Как было объявлено в Go 1.12, Go 1.13 включает поддержку TLS 1.3 в пакете crypto/tls по умолчанию. Её можно отключить, добавив значение tls13=0 в переменную окружения GODEBUG. Отключение будет удалено в Go 1.14.

См. заметки о выпуске Go 1.12 для важной информации о совместимости.

crypto/ed25519

Новый пакет crypto/ed25519 реализует схему подписи Ed25519. Эта функциональность ранее предоставлялась пакетом golang.org/x/crypto/ed25519, который становится обёрткой для crypto/ed25519 при использовании с Go 1.13+.

Обёртывание ошибок

Go 1.13 содержит поддержку обёртывания ошибок, как впервые предложено в предложении Error Values и обсуждавшемся в связанной задаче.

Ошибка e может обёртывать другую ошибку w, предоставляя метод Unwrap, который возвращает w. И e, и w доступны программам, что позволяет e предоставлять дополнительный контекст для w или переинтерпретировать её, сохраняя при этом возможность программ принимать решения на основе w.

Для поддержки обёртывания, fmt.Errorf теперь имеет спецификатор %w для создания обёрнутых ошибок, а также три новых функции в пакете errors ( errors.Unwrap, errors.Is и errors.As) упрощают распаковку и анализ обёрнутых ошибок.

Для получения дополнительной информации, ознакомьтесь с errors документацией пакета или обратитесь к Error Value FAQ. Скоро также выйдет пост в блоге.

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

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

bytes

Новая функция ToValidUTF8 возвращает копию заданного среза байтов, где каждая последовательность недопустимых байтов UTF-8 заменена на заданный срез.

context

Форматирование контекстов, возвращаемых функцией WithValue, больше не зависит от fmt и не будет строкифицироваться одинаково. Код, который полагался на точное предыдущее строковое представление, может быть затронут.

crypto/tls

Поддержка версии SSL 3.0 (SSLv3) теперь устарела и будет удалена в Go 1.14. Обратите внимание, что SSLv3 — это криптографически сломанный протокол, предшествующий TLS.

SSLv3 всегда был отключен по умолчанию, за исключением Go 1.12, когда он был ошибочно включен по умолчанию на стороне сервера. Теперь он снова отключен по умолчанию. (SSLv3 никогда не поддерживался на стороне клиента.)

Сертификаты Ed25519 теперь поддерживаются в TLS версиях 1.2 и 1.3.

crypto/x509

Ключи Ed25519 теперь поддерживаются в сертификатах и запросах сертификатов согласно RFC 8410, а также функциями ParsePKCS8PrivateKey, MarshalPKCS8PrivateKey и ParsePKIXPublicKey.

Пути поиска корневых сертификатов системы теперь включают /etc/ssl/cert.pem для поддержки стандартного расположения в Alpine Linux 3.7+.

database/sql

Новый тип NullTime представляет time.Time, который может быть null.

Новый тип NullInt32 представляет int32, который может быть null.

debug/dwarf

Метод Data.Type больше не вызывает панику, если встречает неизвестный DWARF тег в графе типов. Вместо этого он представляет этот компонент типа с помощью объекта UnsupportedType.

errors

Новая функция As находит первое значение ошибки в цепочке (последовательности обёрнутых ошибок) заданного значения ошибки, которое соответствует типу заданного цели, и если такое значение найдено, устанавливает цель в значение этой ошибки.

Новая функция Is сообщает, соответствует ли заданное значение ошибки ошибке в другой цепочке.

Новая функция Unwrap возвращает результат вызова Unwrap для заданной ошибки, если такой метод существует.

fmt

Спецификаторы формата %x и %X теперь форматируют вещественные и комплексные числа в шестнадцатеричной записи, в нижнем и верхнем регистре соответственно.

Новый спецификатор формата %O форматирует целые числа в восьмеричной системе счисления, добавляя префикс 0o.

Сканер теперь принимает шестнадцатеричные вещественные значения, цифровые разделители в виде подчеркиваний и ведущие префиксы 0b и 0o. Подробности см. в разделе Изменения в языке.

Функция Errorf получила новый спецификатор %w, операнд которого должен быть ошибкой. Ошибка, возвращаемая из Errorf, будет иметь метод Unwrap, который возвращает операнд %w.

go/scanner

Сканер был обновлён для распознавания новых литералов чисел в Go, а именно: двоичных литералов с префиксом 0b/0B, восьмеричных литералов с префиксом 0o/0O, а также чисел с шестнадцатеричной мантиссой. Мнимая часть i теперь может использоваться с любым числовым литералом, а символ подчёркивания может применяться как разделитель разрядов для группировки. См. Изменения в языке для получения подробной информации.

go/types

Тип-чекер был обновлён в соответствии с новыми правилами для сдвигов целых чисел. См. Изменения в языке для получения подробной информации.

html/template

При использовании тега <script> с атрибутом type установленным в «module», код будет теперь интерпретироваться как модульный скрипт JavaScript.

log

Новая функция Writer возвращает место назначения вывода для стандартного логгера.

math/big

Новый метод Rat.SetUint64 устанавливает значение Rat в значение типа uint64.

Для Float.Parse, если основание равно 0, символы подчёркивания могут использоваться между цифрами для улучшения читаемости. См. Изменения в языке для получения подробной информации.

Для Int.SetString, если основание равно 0, символы подчёркивания могут использоваться между цифрами для улучшения читаемости. См. Изменения в языке для получения подробной информации.

Rat.SetString теперь принимает не десятичные представления чисел с плавающей точкой.

math/bits

Время выполнения функций Add, Sub, Mul, RotateLeft и ReverseBytes теперь гарантируется быть независимым от входных данных.

net

В системах Unix, где use-vc установлен в resolv.conf, для разрешения DNS используется TCP.

Новое поле ListenConfig.KeepAlive задаёт период keep-alive для сетевых соединений, принятых слушателем. Если это поле равно 0 (по умолчанию), то keep-alive по TCP будет включено. Чтобы отключить его, установите отрицательное значение.

Обратите внимание, что ошибка, возвращаемая при операциях ввода-вывода на соединении, закрытом по таймауту keep-alive, будет иметь метод Timeout, который возвращает true при вызове. Это может сделать ошибку keep-alive трудной для различения с ошибкой, возвращённой из-за пропущенного дедлайна, заданного методом SetDeadline и аналогичными методами. Код, использующий дедлайны и проверяющий их с помощью метода Timeout или с помощью os.IsTimeout, может захотеть отключить keep-alive или использовать errors.Is(syscall.ETIMEDOUT) (в системах Unix), который будет возвращать true для таймаута keep-alive и false для таймаута дедлайна.

net/http

Новые поля Transport.WriteBufferSize и Transport.ReadBufferSize позволяют задать размеры буферов записи и чтения для Transport. Если какое-либо из этих полей равно нулю, используется размер по умолчанию — 4 КБ.

Новое поле Transport.ForceAttemptHTTP2 управляет включением HTTP/2, когда предоставляется ненулевая функция Dial, DialTLS, или DialContext или TLSClientConfig.

Transport.MaxConnsPerHost теперь корректно работает с HTTP/2.

TimeoutHandler’s ResponseWriter теперь реализует интерфейс Pusher.

Добавлен код состояния 103 "Early Hints".

Transport теперь использует реализацию Request.Body интерфейса io.ReaderFrom, если она доступна, чтобы оптимизировать запись тела запроса.

При обнаружении неподдерживаемых transfer-encodings http.Server теперь возвращает статус “501 Unimplemented”, как того требует спецификация HTTP RFC 7230 Section 3.3.1.

Новые поля Server BaseContext и ConnContext позволяют более тонко управлять значениями Context, предоставляемыми запросам и соединениям.

http.DetectContentType теперь корректно определяет сигнатуры RAR, и теперь также может определять сигнатуры RAR v5.

Новый метод Header Clone возвращает копию получателя.

Добавлена новая функция NewRequestWithContext, которая принимает Context, управляющий всей жизненным циклом создаваемого исходящего Request, и подходящая для использования с Client.Do и Transport.RoundTrip.

Transport больше не записывает в журнал ошибки, когда серверы штатно завершают неактивные соединения с использованием ответа "408 Request Timeout".

os

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

Если File открывается с флагом O_APPEND, его метод WriteAt всегда возвращает ошибку.

os/exec

В Windows среда для Cmd всегда наследует значение %SYSTEMROOT% родительского процесса, если только поле Cmd.Env не содержит явного значения для него.

reflect

Новый метод Value.IsZero сообщает, является ли Value нулевым значением для своего типа.

Функция MakeFunc теперь позволяет использовать преобразования присваивания для возвращаемых значений, вместо того чтобы требовать точного совпадения типов. Это особенно полезно, когда возвращаемый тип — это интерфейс, но фактически возвращаемое значение — это конкретное значение, реализующее этот тип.

runtime

Трассировки, runtime.Caller, и runtime.Callers теперь ссылаются на функцию, инициализирующую глобальные переменные пакета PKG, как PKG.init вместо PKG.init.ializers.

strconv

Для strconv.ParseFloat, strconv.ParseInt и strconv.ParseUint, если основание равно 0, подчеркивания могут использоваться между цифрами для улучшения читаемости. См. Изменения в языке для получения подробной информации.

strings

Новая функция ToValidUTF8 возвращает копию заданной строки, в которой каждая последовательность недопустимых байтов UTF-8 заменена заданной строкой.

sync

Быстрые пути Mutex.Lock, Mutex.Unlock, RWMutex.Lock, RWMutex.RUnlock и Once.Do теперь встраиваются в вызывающие функции. Для не конфликтующих случаев на amd64, эти изменения делают Once.Do в два раза быстрее, а методы Mutex/RWMutex до 10% быстрее.

Большие Pool больше не увеличивают время пауз при остановке мира.

Pool больше не требует полной перезаполнения после каждой сборки мусора. Теперь он сохраняет некоторые объекты между сборками мусора, в отличие от освобождения всех объектов, что снижает пиковые нагрузки для активных пользователей Pool.

syscall

Использование _getdirentries64 было удалено из сборок для Darwin, чтобы разрешить загрузку бинарных файлов Go в macOS App Store.

Новые поля ProcessAttributes и ThreadAttributes в SysProcAttr были представлены для Windows, предоставляя параметры безопасности при создании новых процессов.

EINVAL больше не возвращается при нулевом Chmod режиме на Windows.

Значения типа Errno могут быть проверены на соответствие значениям ошибок в пакете os, например ErrExist, с использованием errors.Is.

syscall/js

TypedArrayOf был заменён на CopyBytesToGo и CopyBytesToJS для копирования байтов между срезом байтов и Uint8Array.

testing

При запуске бенчмарков, B.N больше не округляется.

Новый метод B.ReportMetric позволяет пользователям сообщать пользовательские метрики бенчмарков и переопределять встроенные метрики.

Флаги тестирования теперь регистрируются в новой функции Init, которая вызывается сгенерированной функцией main для теста. В результате, флаги тестирования теперь регистрируются только при запуске тестовой бинарной программы, и пакеты, вызывающие flag.Parse во время инициализации пакета, могут привести к сбою тестов.

text/scanner

Сканер был обновлён для распознавания новых литералов чисел Go, а именно двоичных литералов с префиксом 0b/0B, восьмеричных литералов с префиксом 0o/0O, и чисел с плавающей точкой с шестнадцатеричной мантиссой. Также, новый режим AllowDigitSeparators позволяет литералам чисел содержать символы подчёркивания как разделители цифр (по умолчанию отключён для обратной совместимости). См. Изменения в языке для подробностей.

text/template

Новая функция slice возвращает результат среза своего первого аргумента по следующим аргументам.

time

Поддержка дня года теперь доступна в Format и Parse.

Новые методы типа Duration Microseconds и Milliseconds возвращают длительность как целочисленное количество соответствующих единиц времени.

unicode

Пакет unicode и связанная с ним поддержка по всей системе были обновлены с Unicode 10.0 до Unicode 11.0, что добавляет 684 новых символа, включая семь новых письменностей, и 66 новых эмодзи.

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

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