воскресенье, 21 февраля 2021 г.

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

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

Новый пакет 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:

  • Discard => io.Discard
  • NopCloser => io.NopCloser
  • ReadAll => io.ReadAll
  • ReadDir => os.ReadDir (примечание: возвращает срез os.DirEntry, а не срез fs.FileInfo)
  • ReadFile => os.ReadFile
  • TempDir => os.MkdirTemp
  • TempFile => os.CreateTemp
  • WriteFile => os.WriteFile

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

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

archive/zip

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

crypto/dsa

Пакет crypto/dsa устарел.

crypto/hmac

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

crypto/tls

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

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

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

Серверы теперь будут предпочитать другие доступные наборы шифров 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 и URI. Эти поля могут содержать только строки с символами в диапазоне ASCII.

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

Проверка подписи DSA больше не поддерживается. Обратите внимание, что создание подписи DSA никогда не поддерживалось.

В 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.

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

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

go/build/constraint

Новый пакет go/build/constraint анализирует строки ограничений сборки, как исходный синтаксис // +build, так и синтаксис //go:build, который будет представлен в Go 1.17. Этот пакет существует для того, чтобы инструменты, созданные с помощью Go 1.16, могли обрабатывать исходный код Go 1.17. Обратите внимание, что строки //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

Новая функция по умолчанию обеспечивает доступ к регистратору по умолчанию.

log/syslog

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

mime/multipart

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

net

Случай ввода-вывода в закрытом сетевом соединении или ввода-вывода в сетевом соединении, которое закрывается до завершения любой из операций ввода-вывода, теперь можно обнаружить с помощью новой ошибки ErrClosed. Типичное использование - это errors.Is(err, net.ErrClosed). В более ранних релизах единственным способом надежного обнаружения этого случая было сопоставление строки, возвращаемой методом 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. В прошлых релизах обрезалось только поле 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".

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

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

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

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

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

net/http/httputil

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

net/smtp

Теперь метод Mail Client отправляет директиву 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 теперь возвращают ошибку, если несопоставленная часть шаблона имеет синтаксическую ошибку. Раньше функции возвращали рано при неудачном сопоставлении и, таким образом, не сообщали о каких-либо последующих синтаксических ошибках в шаблоне.

runtime/debug

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

strconv

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

syscall

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

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, что добавляет 5930 новых символов, включая четыре новых скрипта и 55 новых эмодзи. Unicode 13.0.0 также обозначает плоскость 3 (U+30000-U+3FFFF) как третичную идеографическую плоскость.


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


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

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