суббота, 28 сентября 2019 г.

Go 1.13 заметки о релизе

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

Начиная с Go 1.13, команда go по умолчанию загружает и аутентифицирует модули, используя зеркало 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 настройка теперь активирует режим с учетом модулей (module-aware mode) команды go всякий раз, когда текущий рабочий каталог содержит или находится под каталогом, содержащим файл go.mod - даже если текущий каталог находится в GOPATH/src. Это изменение упрощает миграцию существующего кода в GOPATH/src и текущее обслуживание пакетов с поддержкой модулей наряду с импортерами, не поддерживающими модули.

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

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

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

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

go env -w GOPROXY=direct
go env -w GOSUMDB=off

go get

В режиме с поддержкой модулей (module-aware mode) 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 в режиме модуля (module mode) обновляет только не тестовые зависимости, как в режиме GOPATH. Теперь он также принимает флаг -t, который (как в режиме GOPATH) заставляет go get включать пакеты, импортированные тестами пакетов, названных в командной строке.

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

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

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

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

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

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

  • Префикс версии должен иметь форму vX.0.0, или производный от тега на предке названной ревизии, или производный от тега, который включает метаданные сборки в самой именованной ревизии.
  • Строка даты должна соответствовать метке времени UTC ревизии.
  • Короткое имя ревизии должно использовать то же количество символов, что и команда go. (Для хэшей SHA-1, используемых git, 12-значный префикс.)

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

require github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c

можно отредактировать на

require github.com/docker/docker e7b5f7dbe98c

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

require github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c

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

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

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

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

Команда 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 now устанавливает тег create build, чтобы в файлах можно было искать директивы, но игнорировать их во время сборки.

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

Цепочка инструментов компилятора (Compiler toolchain)

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

Компилятор больше не выдает с плавающей точкой или сложные константы в файлы 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 локально, сначала установите его вручную:

go get golang.org/x/tools/cmd/godoc
godoc

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

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

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

Этот релиз улучшает производительность большинства применений defer на 30%.

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

Основная библиотека (Core library)


TLS 1.3

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

crypto/ed25519

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

Оборачивание ошибок

В версии 1.13 содержится поддержка оборачивания ошибок.

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

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

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

Как всегда, в библиотеку внесены различные незначительные изменения и обновления, сделанные с учетом требований совместимости 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.

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

database/sql

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

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

debug/dwarf

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

errors

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

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

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

fmt

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

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

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

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

go/scanner

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

go/types

Проверка типов была обновлена ​​в соответствии с новыми правилами для целочисленных сдвигов.

html/template

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

log

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

math/big

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

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

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

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

math/bits

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

net

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

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

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

net/http

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

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

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

ResponseWriter для TimeoutHandler теперь реализует интерфейсы Pusher и Flusher.

StatusCode 103 "Early Hints" был добавлен.

Transport теперь использует реализацию io.ReaderFrom для Request.Body, если она доступна, для оптимизации написания тела.

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

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

http.DetectContentType теперь корректно обнаруживает подписи RAR, а также может теперь обнаруживать подписи RAR v5.

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

Была добавлена ​​новая функция 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 сообщает, является ли значение нулевым значением для его типа.

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

runtime

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

strconv

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

strings

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

sync

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

Большой Pool больше не увеличивает время паузы в остановке мира (stop-the-world).

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

syscall

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

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

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

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, микросекунды и миллисекунды, возвращают длительность в виде целого числа их соответственно названных единиц измерения.

unicode

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


Читайте также:


Комментариев нет:

Отправить комментарий