суббота, 15 августа 2020 г.

Релиз Go 1.15, основная библиотека

Новый встроенный пакет tzdata

Go 1.15 включает новый пакет time/tzdata, который позволяет встраивать базу данных часовых поясов в программу. Импорт этого пакета (как import _ "time/tzdata") позволяет программе находить информацию о часовом поясе, даже если база данных часовых поясов недоступна в локальной системе. Вы также можете встроить базу данных часовых поясов, создав с помощью -tags timetzdata. При любом подходе размер программы увеличивается примерно на 800 КБ.

Cgo

Go 1.15 преобразует C-тип EGLConfig в Go-тип uintptr. Это изменение аналогично тому, как Go 1.12 и новее обрабатывает типы EGLDisplay, Darwin CoreFoundation и Java JNI.

Прекращение поддержки X.509 CommonName

Устаревшее поведение, заключающееся в обработке поля CommonName в сертификатах X.509 как имени хоста при отсутствии альтернативных имен субъектов, теперь по умолчанию отключено. Его можно временно снова включить, добавив значение x509ignoreCN=0 в переменную среды GODEBUG.

Обратите внимание, что если CommonName является недопустимым именем хоста, оно всегда игнорируется, независимо от настроек GODEBUG. К недопустимым именам относятся имена с любыми символами, кроме букв, цифр, дефисов и подчеркиваний, а также имена с пустыми метками или конечными точками.

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

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

bufio

Когда Scanner используется с недопустимым io.Reader, который неправильно возвращает отрицательное число из Read, Scanner больше не паникует, а вместо этого вернет новую ошибку ErrBadReadCount.

context

Создание производного Context с использованием родительского nil элемента теперь явно запрещено. Любая попытка сделать это с помощью функций WithValue, WithDeadline или WithCancel вызовет панику.

crypto

Типы PrivateKey и PublicKey в пакетах crypto/rsa, crypto/ecdsa и crypto/ed25519 теперь имеют метод Equal для сравнения ключей на эквивалентность или для создания интерфейсов с типобезопасностью для публичных ключей. Сигнатура метода совместима с определением равенства go-cmp.

Hash теперь реализует fmt.Stringer.

crypto/ecdsa

Новые функции SignASN1 и VerifyASN1 позволяют генерировать и проверять подписи ECDSA в стандартной кодировке DER ASN.1.

crypto/elliptic

Новые функции MarshalCompressed и UnmarshalCompressed позволяют кодировать и декодировать точки эллиптических кривых NIST в сжатом формате.

crypto/rsa

VerifyPKCS1v15 теперь отклоняет недопустимые короткие подписи с отсутствующими ведущими нулями в соответствии с RFC 8017.

crypto/tls

Новый тип Dialer и его метод DialContext позволяют использовать контекст как для подключения, так и для обмена рукопожатиями с сервером TLS.

Новый обратный вызов VerifyConnection для типа Config позволяет настраивать логику проверки для каждого соединения. Он имеет доступ к ConnectionState, который включает сертификаты одноранговых узлов (peer certificates), SCT и сшитые ответы OCSP.

Автоматически сгенерированные ключи билета сеанса теперь автоматически меняются каждые 24 часа со сроком действия 7 дней, чтобы ограничить их влияние на прямую секретность.

Время жизни сеансового билета в TLS 1.2 и более ранних версиях, где ключи сеанса повторно используются для возобновленных подключений, теперь ограничено 7 днями, чтобы ограничить их влияние на прямую секретность.

Проверки защиты от перехода на более раннюю версию на стороне клиента, указанные в RFC 8446, теперь применяются. Это может вызвать ошибки подключения для клиентов, сталкивающихся с промежуточными ящиками, которые ведут себя как атаки с несанкционированным переходом на более раннюю версию.

SignatureScheme, CurveID и ClientAuthType теперь реализуют fmt.Stringer.

Поля ConnectionState OCSPResponse и SignedCertificateTimestamps теперь повторно заполняются для возобновленных подключений на стороне клиента.

tls.Conn теперь возвращает непрозрачную ошибку при постоянно разорванных соединениях, оборачивая временную net.Error. Чтобы получить доступ к исходной net.Error, используйте errors.As (или errors.Unwrap) вместо утверждения типа.

crypto/x509

Если имя в сертификате или проверяемое имя (с VerifyOptions.DNSName или VerifyHostname) недопустимы, они теперь будут сравниваться без учета регистра без дальнейшей обработки (без учета подстановочных знаков или удаления конечных точек). К недействительным именам относятся имена с любыми символами, кроме букв, цифр, дефисов и подчеркиваний, имена с пустыми метками и имена сертификатов с точками в конце.

Новая функция CreateRevocationList и тип RevocationList позволяют создавать списки отозванных сертификатов X.509 v2, соответствующие RFC 5280.

CreateCertificate теперь автоматически генерирует SubjectKeyId, если шаблон является центром сертификации и не указывает его явно.

CreateCertificate теперь возвращает ошибку, если в шаблоне указан MaxPathLen, но он не является центром сертификации.

В системах Unix, отличных от macOS, переменная среды SSL_CERT_DIR теперь может быть списком, разделенным двоеточиями.

В macOS двоичные файлы теперь всегда связаны с Security.framework для извлечения системных доверенных корней, независимо от того, доступно ли cgo. Полученное поведение должно быть более согласованным с верификатором ОС.

crypto/x509/pkix

Name.String теперь печатает нестандартные атрибуты из имен, если ExtraNames равно nil.

database/sql

Новый метод DB.SetConnMaxIdleTime позволяет удалить соединение из пула соединений после того, как оно какое-то время бездействовало, без учета общего срока жизни соединения. Поле DBStats.MaxIdleTimeClosed показывает общее количество соединений, закрытых из-за DB.SetConnMaxIdleTime.

Новый метод получения Row.Err позволяет проверять ошибки запроса без вызова Row.Scan.

database/sql/driver

Новый интерфейс Validator может быть реализован Conn, чтобы позволить драйверам сигнализировать, действительно ли соединение или его следует отменить.

debug/pe

Пакет теперь определяет константы IMAGE_FILE, IMAGE_SUBSYSTEM и IMAGE_DLLCHARACTERISTICS, используемые форматом файла PE.

encoding/asn1

Marshal теперь сортирует компоненты SET OF в соответствии с X.690 DER.

Unmarshal теперь отклоняет теги и идентификаторы объектов, которые минимально не закодированы в соответствии с X.690 DER.

encoding/json

Пакет теперь имеет внутреннее ограничение на максимальную глубину вложенности при декодировании. Это снижает вероятность того, что глубоко вложенный ввод может использовать большие объемы памяти стека или даже вызвать панику "goroutine stack exceeds limit".

flag

Когда пакет flag видит -h или -help, а эти флаги не определены, он теперь печатает сообщение об использовании. Если FlagSet был создан с ExitOnError, FlagSet.Parse будет завершен со статусом 2. В этом релизе статус выхода для -h или -help изменен на 0. В частности, это относится к обработке по умолчанию флагов коммандной строки.

fmt

Команды печати %#g и %#G теперь сохраняют конечные нули для значений с плавающей запятой.

go/format

Функции Source и Node теперь канонизируют префиксы и показатели числовых литералов как часть форматирования исходного кода Go. Это соответствует поведению команды gofmt, реализованной начиная с Go 1.13.

html/template

В пакете теперь используются escape-символы Unicode (\uNNNN) во всех контекстах JavaScript и JSON. Это исправляет ошибки экранирования в контекстах application/ld+json и application/json.

io/ioutil

TempDir и TempFile теперь отклоняют шаблоны, содержащие разделители путей. То есть такие вызовы, как ioutil.TempFile("/tmp", "../base*") больше не будут успешными. Это предотвращает непреднамеренный обход каталога.

math/big

Новый метод Int.FillBytes позволяет сериализовать в заранее выделенные байтовые срезы фиксированного размера.

math/cmplx

Функции в этом пакете были обновлены для соответствия стандарту C99 (приложение G, совместимое с IEC 60559 комплексная арифметика) в отношении обработки специальных аргументов, таких как бесконечность, NaN и ноль со знаком.

net

Если операция ввода-вывода превышает крайний срок, установленный методами Conn.SetDeadline, Conn.SetReadDeadline или Conn.SetWriteDeadline, она теперь будет возвращать ошибку, которая является os.ErrDeadlineExceeded или обертывает ее. Это может использоваться для надежного определения того, является ли ошибка следствием превышения крайнего срока. В более ранних выпусках рекомендовалось вызывать метод Timeout при ошибке, но операции ввода-вывода могут возвращать ошибки, для которых Timeout возвращает true, хотя крайний срок не был превышен.

Новый метод Resolver.LookupIP поддерживает поиск IP-адресов, который зависит от сети и принимает контекст.

net/http

Синтаксический анализ теперь является более строгой мерой защиты от атак контрабанды запросов (request smuggling attacks): пробелы, не относящиеся к ASCII, больше не обрезаются, как SP и HTAB, а поддержка "идентификационного" Transfer-Encoding была прекращена.

net/http/httputil

ReverseProxy теперь поддерживает запрет на изменение заголовка X-Forwarded-For, когда входящая запись карты Request.Header для этого поля равна nil.

Когда запрос протокола переключения (например, WebSocket), обрабатываемый ReverseProxy, отменяется, серверное соединение теперь закрывается правильно.

net/http/pprof

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

net/url

Новое поле URL-адреса RawFragment и метод EscapedFragment предоставляют подробную информацию о точном кодировании конкретного фрагмента и контролируют его. Они аналогичны RawPath и EscapedPath.

Новый метод URL-адреса Redacted возвращает URL-адрес в строковой форме с заменой любого пароля на xxxxx.

os

Если операция ввода-вывода превышает крайний срок, установленный методами File.SetDeadline, File.SetReadDeadline или File.SetWriteDeadline, теперь она будет возвращать ошибку, которая является или обертывает os.ErrDeadlineExceeded. Это может использоваться для надежного определения того, является ли ошибка следствием превышения крайнего срока. В более ранних выпусках рекомендовалось вызывать метод Timeout при ошибке, но операции ввода-вывода могут возвращать ошибки, для которых Timeout возвращает true, хотя крайний срок не был превышен.

Пакеты os и net теперь автоматически повторяют системные вызовы, которые завершаются ошибкой с EINTR. Раньше это приводило к ложным сбоям, которые стали более распространенными в Go 1.14 с добавлением асинхронного прерывания. Теперь это делается прозрачно.

Тип os.File теперь поддерживает метод ReadFrom. Это позволяет использовать системный вызов copy_file_range в некоторых системах при использовании io.Copy для копирования данных из одного файла os.File в другой. Как следствие, io.CopyBuffer не всегда будет использовать указанный буфер при копировании в os.File. Если программа хочет принудительно использовать предоставленный буфер, это можно сделать, написав io.CopyBuffer(struct{ io.Writer }{dst}, src, buf).

plugin

Генерация DWARF теперь поддерживается (и включена по умолчанию) для -buildmode=plugin в macOS.

Сборка с -buildmode=plugin теперь поддерживается на freebsd/amd64.

reflect

Пакет reflect теперь запрещает доступ к методам всех неэкспортируемых полей, тогда как ранее он разрешал доступ к методам неэкспортированных встроенных полей. Код, основанный на предыдущем поведении, следует обновить, чтобы вместо этого получить доступ к соответствующему продвинутому методу включающей переменной.

regexp

Новый метод Regexp.SubexpIndex возвращает индекс первого подвыражения с заданным именем в регулярном выражении.

runtime

Некоторые функции, включая ReadMemStats и GoroutineProfile, больше не блокируются, если выполняется сборка мусора.

runtime/pprof

Профиль goroutine теперь включает метки профиля, связанные с каждой goroutine во время профилирования. Эта функция еще не реализована для профиля, о котором сообщается с debug=2.

strconv

FormatComplex и ParseComplex добавлены для работы с комплексными числами.

FormatComplex преобразует комплексное число в строку формы (a+bi), где a и b - действительная и мнимая части.

ParseComplex преобразует строку в комплексное число заданной точности. ParseComplex принимает комплексные числа в формате N+Ni.

sync

Новый метод Map.LoadAndDelete атомарно удаляет ключ и возвращает предыдущее значение, если оно есть.

Метод Map.Delete более эффективен.

syscall

В системах Unix функции, использующие SysProcAttr, теперь будут отклонять попытки установить оба поля Setctty и Foreground, поскольку они оба используют поле Ctty, но делают это несовместимыми способами. Ожидается, что некторые существующие программы устанавливают оба поля.

Для настройки поля Setctty теперь требуется, чтобы в поле Ctty был установлен номер дескриптора файла в дочернем процессе, как определено в поле ProcAttr.Files. Использование дочернего дескриптора всегда работало, но в некоторых случаях использование родительского файлового дескриптора также помогало. Некоторым программам, которые устанавливают Setctty, необходимо будет изменить значение Ctty, чтобы использовать номер дочернего дескриптора.

Теперь можно вызывать системные вызовы, возвращающие значения с плавающей запятой в windows/amd64.

testing

Тип testing.T теперь имеет метод Deadline, который сообщает время, когда тестовый двоичный файл превысит свой таймаут.

Функция TestMain больше не требуется для вызова os.Exit. Если функция TestMain вернется, тестовый двоичный файл вызовет os.Exit со значением, возвращаемым m.Run.

Новые методы T.TempDir и B.TempDir возвращают временные каталоги, которые автоматически очищаются в конце теста.

go test -v теперь группирует вывод по имени теста, а не печатает имя теста в каждой строке.

text/template

JSEscape теперь постоянно использует escape-символы Unicode (\u00XX), которые совместимы с JSON.

time

Новый метод Ticker.Reset поддерживает изменение длительности тикера.

При возврате ошибки ParseDuration теперь цитирует исходное значение.


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


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

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