Показаны сообщения с ярлыком релизы Go. Показать все сообщения
Показаны сообщения с ярлыком релизы Go. Показать все сообщения

суббота, 29 февраля 2020 г.

Релиз Go 1.14: основная библиотека

Новый пакет хэширования последовательности байтов

Go 1.14 включает новый пакет hash/maphash, который предоставляет хэш-функции для последовательностей байтов. Эти хэш-функции предназначены для использования для реализации хэш-таблиц или других структур данных, которые должны отображать произвольные строки или байтовые последовательности в равномерное распределение по 64-разрядным целым числам без знака.

Хэш-функции устойчивы к столкновениям (коллизиям), но криптографически небезопасны.

Хэш-значение данной последовательности байтов согласовано в рамках одного процесса, но будет различным в разных процессах.

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

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

crypto/tls

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

TLS 1.3 больше нельзя отключить с помощью переменной среды GODEBUG. Используйте поле Config.MaxVersion для настройки версий TLS.

Когда через поле Config.Certificates предоставляется несколько цепочек сертификатов, автоматически выбирается первая, совместимая с партнером. Это позволяет, например, предоставить ECDSA и сертификат RSA и позволить пакету автоматически выбрать лучший. Обратите внимание, что производительность этого выбора будет низкой, если не установлено поле Certificate.Leaf.

Новые функции CipherSuites и InsecureCipherSuites возвращают список реализованных в настоящее время наборов шифров. Новая функция CipherSuiteName возвращает имя для идентификатора набора шифров.

Новые методы (*ClientHelloInfo).SupportsCertificate и (*CertificateRequestInfo).SupportsCertificate показывают, поддерживает ли одноранговый узел определенный сертификат.

Пакет tls больше не поддерживает устаревшее расширение Next Protocol Negotiation (NPN) и теперь поддерживает только ALPN. В предыдущих релизах он поддерживал оба. Изменений в API нет, и приложения должны работать так же, как и раньше. Большинство других клиентов и серверов уже удалили поддержку NPN в пользу стандартизированной ALPN.

Подписи RSA-PSS теперь используются, когда они поддерживаются в рукопожатиях TLS 1.2. Это не повлияет на большинство приложений, но пользовательские реализации Certificate.PrivateKey, которые не поддерживают подписи RSA-PSS, должны будут использовать новое поле Certificate.SupportedSignatureAlgorithms, чтобы отключить их.

Config.Certificates и Config.GetCertificate теперь могут быть равны nil, если задан Config.GetConfigForClient. Если обратные вызовы не возвращают ни сертификаты, ни ошибку, теперь отправляется unrecognized_name.

Новое поле CertificateRequestInfo.Version предоставляет версию TLS для обратных вызовов сертификатов клиентов.

Новые константы TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 и TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 используют итоговые имена для наборов шифров, ранее называвшихся TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 и TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305.

crypto/x509

Certificate.CreateCRL теперь поддерживает издателей Ed25519.

debug/dwarf

Пакет debug/dwarf теперь поддерживает чтение DWARF версии 5.

Новый метод (*Data).AddSection поддерживает добавление произвольных новых разделов DWARF из входного файла в данные DWARF.

Новый метод (*Reader).ByteOrder возвращает порядок байтов текущей единицы компиляции. Это может использоваться для интерпретации атрибутов, которые закодированы в собственном порядке, таких как описания местоположения.

Новый метод (*LineReader).Files возвращает таблицу имен файлов из программы чтения строк. Это может использоваться для интерпретации значения атрибутов DWARF, таких как AttrDeclFile.

encoding/asn1

Unmarshal теперь поддерживает ASN.1 строковый тип BMPString, представленный новой константой TagBMPString.

encoding/json

Тип Decoder поддерживает новый метод InputOffset, который возвращает смещение байта входного потока текущей позиции декодера.

Compact больше не экранирует символы U+2028 и U+2029, что никогда не было документированной функцией. Для правильного экранирования смотрите HTMLEscape.

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

go/build

Тип Context имеет новое поле Dir, которое можно использовать для установки рабочего каталога для сборки. По умолчанию используется текущий каталог запущенного процесса. В режиме модуля это используется для определения местоположения основного модуля.

go/doc

Новая функция NewFromFiles вычисляет документацию пакета из списка *ast.File связанных примеров с соответствующими элементами пакета. Новая информация доступна в новом поле Examples в типах Package, Type и Func, а также в новом поле Suffix в типе Example.

io/ioutil

TempDir теперь может создавать каталоги, имена которых имеют предсказуемые префиксы и суффиксы. Как и в случае TempFile, если шаблон содержит '*', случайная строка заменяет последнюю '*'.

log

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

math

Новая функция FMA вычисляет x*y+z в плавающей точке без промежуточного округления вычисления x*y. Несколько архитектур реализуют это вычисление, используя специальные аппаратные инструкции для дополнительной производительности.

math/big

Метод GCD теперь позволяет входам a и b быть нулевыми или отрицательными.

math/bits

Новые функции Rem, Rem32 и Rem64 поддерживают вычисление остатка, даже если частное переполнено.

mime

Тип файлов .js и .mjs по умолчанию теперь text/javascript, а не application/javascript. Это соответствует проекту IETF, в котором application/javascript рассматривается как устаревшее.

mime/multipart

Новый метод Reader NextRawPart поддерживает выборку следующей части MIME без прозрачного декодирования данных для печати в кавычках.

net/http

Новый метод Values типа Header может использоваться для извлечения всех значений, связанных с канонизированным ключом.

Новое поле DialTLSContext типа Transport можно использовать для указания дополнительной dial функции для создания соединений TLS для не проксируемых запросов HTTPS. Это новое поле можно использовать вместо DialTLS, который сейчас считается устаревшим; DialTLS будет продолжать работать, но новый код должен использовать DialTLSContext, что позволяет Transport отменять dial, как только они больше не нужны.

В Windows ServeFile теперь правильно обслуживает файлы размером более 2 ГБ.

net/http/httptest

Новое поле EnableHTTP2 типа Server поддерживает включение HTTP/2 на тестовом сервере.

net/textproto

Новый метод Values типа MIMEHeader ​​можно использовать для извлечения всех значений, связанных с канонизированным ключом.

os/signal

В Windows события CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT и CTRL_SHUTDOWN_EVENT теперь генерируют сигнал syscall.SIGTERM, аналогично тому, как Control-C и Control-Break генерируют сигнал syscall.SIGINT.

plugin

Пакет plugin теперь поддерживает freebsd/amd64.

reflect

StructOf теперь поддерживает создание типов структур с неэкспортированными полями, устанавливая поле PkgPath в элементе StructField.

runtime

runtime.Goexit больше не может быть прерван рекурсивной panic/recover.

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

runtime/pprof

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

strconv

Тип NumError теперь имеет метод Unwrap, который можно использовать для получения причины сбоя преобразования. Это поддерживает использование значений NumError с ошибками. Чтобы узнать, является ли основной ошибкой strconv.ErrRange или strconv.ErrSyntax.

sync

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

testing

Пакет testing теперь поддерживает функции очистки, вызываемые после завершения теста или бенчмарка, вызывая соответственно T.Cleanup или B.Cleanup.

text/template

Пакет text/template теперь правильно сообщает об ошибках, когда аргумент в скобках используется в качестве функции. Это чаще всего проявляется в ошибочных случаях, таких как {{if (eq .F "a") or (eq .F "b")}}. Это должно быть записано как {{if or (eq .F "a") (eq .F "b")}}. Ошибочный случай никогда не работал, как ожидалось, и теперь будет сообщаться с ошибкой - can't give argument to non-function.

unicode

Пакет unicode и связанная с ним поддержка по всей системе были обновлены с Unicode 11.0 до Unicode 12.0, что добавляет 554 новых символа, включая четыре новых сценария и 61 новый эмодзи.


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


Купить gopher

Релиз Go 1.14: runtime и компилятор

Runtime (среда времени выполнения)

Релиз Go 1.14 улучшает производительность большинства применений defer, что приводит к почти нулевым издержкам по сравнению с непосредственным вызовом отложенной функции. В результате, теперь defer можно использовать в коде, критичном к производительности, без лишних проблем.

Goroutines теперь асинхронно вытесняются. В результате циклы без вызовов функций больше не могут заблокировать планировщик или существенно задержать сборку мусора. Это поддерживается на всех платформах, кроме windows/arm, darwin/arm, js/wasm и plan9/*.

Следствием реализации вытеснения является то, что в системах Unix, включая системы Linux и macOS, программы, собранные (build) с Go 1.14, будут получать больше сигналов, чем программы, собранные (build) с более ранними релизами. Это означает, что программы, использующие такие пакеты, как syscall или golang.org/x/sys/unix, увидят, что более медленные системные вызовы завершаются с ошибками EINTR. Этим программам придется каким-то образом обрабатывать эти ошибки, скорее всего, повторяя цикл, чтобы повторить системный вызов.

Распределитель страниц является более эффективным и вызывает значительно меньше конфликтов блокировки при высоких значениях GOMAXPROCS. Это наиболее заметно, так как более низкая задержка и более высокая пропускная способность для больших распределений выполняются параллельно и с высокой скоростью.

Внутренние таймеры, используемые time.After, time.Tick, net.Conn.SetDeadline и схожие, более эффективны, с меньшим количеством конфликтов блокировки и меньшим количеством переключений контекста. Это улучшение производительности, которое не должно вызывать видимых изменений.

Компилятор

В релизе Go 1.14 добавлена ​​опция -d=checkptr в качестве параметра времени компиляции для добавления инструментария для проверки того, что код Go соответствует unsafe.Pointer правилам безопасности динамически. Эта опция включается по умолчанию (кроме Windows) с флагами -race или -msan и может быть отключена с -gcflags=all=-d=checkptr=0. В частности, -d=checkptr проверяет следующее:

  1. При преобразовании unsafe.Pointer в *T результирующий указатель должен быть выровнен соответствующим образом для T.
  2. Если результат арифметики указателя указывает на объект кучи (heap) Go, один из операндов с типом unsafe.Pointer должен указывать на тот же объект.

Использование -d=checkptr в настоящее время не рекомендуется в Windows, потому что это вызывает ложные предупреждения в стандартной библиотеке.

Компилятор теперь может генерировать машиночитаемые журналы ключевых оптимизаций, используя флаг -json, включая встраивание (inlining), escape-анализ, исключение bounds-check (исключение проверки границ) и nil-check.

Детальный escape-анализ (-m=2) теперь снова работает. Ранее он был исключен из новой реализации escape-анализа в предыдущем релизе.

Все символы Go в двоичных файлах macOS теперь начинаются с подчеркивания, следуя соглашениям платформы.

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

Исключение проверки границ теперь использует информацию из создания среза и может исключать проверки для индексов с типами, меньшими, чем int.


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


Купить gopher

Релиз Go 1.14: инструменты, команда go

Вендоринг

Когда основной модуль содержит каталог vendor верхнего уровня и его файл go.mod указывает go 1.14 или выше, команда go по умолчанию теперь имеет значение -mod=vendor для операций, которые принимают этот флаг. Новое значение для этого флага, -mod=mod, заставляет команду go вместо этого загружать модули из кэша модулей (например, когда отсутствует каталог vendor).

Если задано -mod=vendor (явно или по умолчанию), команда go теперь проверяет, что файл vendor/modules.txt основного модуля соответствует его файлу go.mod.

go list -m больше безмолвно не пропускает транзитивные зависимости, которые не предоставляют пакеты в каталоге vendor. Теперь он заврешается неудачей и выдает явную ошибку, если установлен -mod=vendor и запрашивается информация для модуля, не упомянутого в vendor/modules.txt.

Флаги

Команда go get больше не принимает флаг -mod. Ранее настройка флага либо игнорировалась, либо приводила к сбою сборки.

-mod=readonly теперь устанавливается по умолчанию, когда файл go.mod доступен только для чтения и отсутствует каталог vendor верхнего уровня.

-modcacherw - это новый флаг, который указывает команде go оставлять вновь созданные каталоги в кеше модуля с их разрешениями по умолчанию, а не делать их доступными только для чтения. Использование этого флага повышает вероятность того, что тесты или другие инструменты случайно добавят файлы, не включенные в проверенную контрольную сумму модуля. Однако он позволяет использовать rm -rf (вместо go clean -modcache) для удаления кэша модуля.

-modfile=file - это новый флаг, который указывает команде go читать (и, возможно, записывать) альтернативный файл go.mod вместо файла в корневом каталоге модуля. Файл с именем go.mod должен все еще присутствовать для определения корневого каталога модуля, но к нему нет доступа. Если указан параметр -modfile, также используется альтернативный файл go.sum: его путь определяется из флага -modfile путем обрезки расширения .mod и добавления .sum.

Переменные среды

GOINSECURE - это новая переменная среды, которая указывает команде go не требовать HTTPS-соединения и пропускать проверку сертификата при извлечении определенных модулей непосредственно из их источников. Как и существующая переменная GOPRIVATE, значение GOINSECURE представляет собой список glob паттернов, разделенных запятыми.

Команды вне модулей

Когда режим поддержки модуля включен явно (путем установки GO111MODULE=on), большинство команд модуля имеют более ограниченную функциональность, если отсутствует файл go.mod. Например, go build, go run, а другие команды сборки могут собирать пакеты только в стандартной библиотеке и пакеты, указанные как файлы .go в командной строке.

Ранее команда go разрешала бы путь каждого пакета к последней версии модуля, но не записывала путь или версию модуля. Это привело к медленным, невоспроизводимым сборкам.

go get продолжает работать так же, как и раньше, так же как и go mod download и go list -m с явными версиями.

+incompatible версии

Если последняя версия модуля содержит файл go.mod, go get больше не будет обновляться до несовместимой (incompatible) основной версии этого модуля, если только такая версия не запрашивается явно или уже требуется. go list также пропускает несовместимые основные версии для такого модуля при извлечении непосредственно из системы управления версиями, но может включать их, если о них сообщает прокси.

Обслуживание файла go.mod

Команды go, кроме go mod tidy, больше не удаляют директиву require, которая указывает версию косвенной зависимости, которая уже подразумевается другими (транзитивными) зависимостями основного модуля.

Команды go, кроме go mod tidy, больше не редактируют файл go.mod, если изменения носят только косметический характер.

Когда задано -mod=readonly, команды go больше не будут работать из-за отсутствующей директивы go или ошибочного // indirect комментария.

Загрузка модуля

Команда go теперь поддерживает хранилища Subversion в режиме модуля.

Команда go теперь включает фрагменты текстовых сообщений об ошибках от прокси модулей и других HTTP-серверов. Сообщение об ошибке будет отображаться только в том случае, если оно действительно UTF-8 и состоит только из графических символов и пробелов.

Тестирование

go test -v теперь передает поток t.Log тогда, когда это происходит, а не в конце всех тестов.


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


Купить gopher

Релиз Go 1.14: изменения в языке и его портах

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

Поддержка модулей (modules) в команде go теперь готова к производственному использованию, и всем пользователям рекомендуется перейти на модули Go для управления зависимостями.

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

Согласно предложению о перекрывающихся интерфейсах, Go 1.14 теперь позволяет встраивать интерфейсы с перекрывающимися наборами методов: методы из встроенного интерфейса могут иметь те же имена и идентичные сигнатуры, что и методы, уже присутствующие в интерфейсе (встраивание). Это решает проблемы, которые обычно (но не исключительно) возникают с графами встраивания в форме ромба. Явно объявленные методы в интерфейсе должны оставаться уникальными, как и раньше.

Порты


Darwin

Go 1.14 - последний релиз, который будет работать на MacOS 10.11 El Capitan. Go 1.15 потребует macOS 10.12 Sierra или более поздней версии.

Go 1.14 - последний релиз Go, поддерживающий 32-битные двоичные файлы в macOS (порт darwin/386). Они больше не поддерживаются macOS, начиная с macOS 10.15 (Catalina). Go продолжает поддерживать 64-битный порт darwin/amd64.

Go 1.14, вероятно, будет последним выпуском Go, поддерживающим 32-разрядные двоичные файлы на iOS, iPadOS, watchOS и tvOS (порт darwin/arm). Go продолжает поддерживать 64-битный порт darwin/arm64.

Windows

В двоичных файлах Windows теперь включена функция DEP (предотвращение выполнения данных).

WebAssembly

Значения JavaScript, на которые ссылаются из Go через объекты js.Value, теперь могут собираться сборщиком мусора.

Значения js.Value больше нельзя сравнивать с помощью оператора ==, и вместо этого их нужно сравнивать с помощью их метода Equal.

В js.Value теперь есть методы IsUndefined, IsNull и IsNaN.

RISC-V

В версии 1.14 содержится экспериментальная поддержка 64-разрядной версии RISC-V в Linux (GOOS = linux, GOARCH = riscv64). Помните, что производительность, стабильность синтаксиса сборки и, возможно, правильность находятся в стадии разработки.

FreeBSD

Go теперь поддерживает 64-битную архитектуру ARM на FreeBSD 12.0 или более поздней версии (порт freebsd/arm64).

Native Client (NaCl)

Как было объявлено в примечаниях к выпуску Go 1.13, Go 1.14 прекращает поддержку платформы Native Client (GOOS = nacl).

Illumos

Теперь среда выполнения учитывает ограничения CPU зоны (элемент управления ресурсами zone.cpu-cap) для runtime.NumCPU и значение по умолчанию GOMAXPROCS.


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


Купить gopher