Go 1.12

25 февраля вышел Go 1.12, который развивается компанией Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как легкость написания кода, быстрота разработки и защищенность от ошибок. Код проекта распространяется под лицензией BSD.

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

Давайте рассмотрим основные новшества, представленные в выпуске Go 1.12:

В пакет crypto/tls добавлена реализация протокола TLS 1.3. На данный момент пока отсутствует поддержка режима 0-RTT, применяемого для устранения задержек при возобновлении ранее установленных защищенных соединений. Поддержка TLS 1.3 отключена по умолчанию и для включения требует установки опции tls13=1 в переменной окружения GODEBUG. Включение TLS 1.3 по умолчанию ожидается в следующем выпуске;

Продолжена работа по усовершенствованию новой системы модулей, которую можно применять в качестве альтернативы GOPATH. Система модулей отличается интегрированной поддержкой версионирования, средствами доставки пакетов и улучшенной системой управления зависимостями. При помощи модулей разработчики больше не привязаны к работе внутри дерева GOPATH, могут явно определять зависимости с учетом версий и создавать повторяемые сборки. Из улучшений по сравнению с прошлым выпуском отмечается реализация поддержки параллельного выполнения операций загрузки и извлечения модулей при помощи команды go. Директива go внутри файла go.mod теперь учитывает версию языка Go, используемую в коде модуля (по дефолту используется текущий релиз). Систему модулей планируется анонсировать в выпуске Go 1.13. До этого требуется явная активация системы модулей через переменную GO111MODULE=on или использование контекста, в котором модули применяются автоматически (например, когда команда go выполняется не в каталоге GOPATH/src и когда в корне текущего каталога присутствует файл go.mod). Начиная с текущего выпуска система модулей также автоматически используется при выполнении команд подобных go run x.go или go get rsc.io/2fa@v1.1.0 без явного указания файла go.mod;

В компиляторе улучшен анализ изменения переменных (live variable analysis). Расширен спектр функций для которых по умолчанию применяется inline-развертывание кода, в том числе данная оптимизация теперь применима для функций, работа которых ограничивается вызовом других функций.

Добавлен новый флаг -lang, позволяющий выбрать конкретную версию языка. Так, в процессе компиляции будет выведена ошибка, если запустить компилятор с флагом -lang=go1.8 для программы, в которой используется функциональность более новых версий Go.

Улучшена генерация отладочной информации в формате DWARF, в том числе добавлены сведения о выводимых аргументах и местоположении переменных.

Значительно увеличена производительность сборки мусора в ситуациях, когда большая часть кучи остается активной, что позволяет уменьшить время выделения памяти сразу после сборки мусора. В Go runtime улучшена масштабируемость кода таймеров (timer и deadline) на системах с большим числом CPU;

Обеспечен более агрессивный возврат освобожденной памяти обратно операционной системе. Для возвращения неиспользуемой памяти в Linux задействован флаг MADV_FREE, который только помечает блок доступным для освобождения, но не освобождает сразу, что позволяет вернуть его без генерации page fault, если обращение произошло до его фактического использования ядром.

В переменной окружения GODEBUG добавлена поддержка флага cpu.extension=off, отключающего использования расширенных инструкций CPU в коде стандартной библиотеки и в runtime;

Утилита godoc теперь не предоставляет интерфейс командной строки, а доступна только в форме web-сервера для просмотра документации через браузер. Для вывода подсказки в командной строке следует использовать команду go doc. В go doc добавлена новая опция "-all" для вывода всех экспортируемых API и документации по ним;

Детектор состояний гонки (race detector) портирован для платформы linux/arm64;

Прекращена поддержка команды go tool vet, вместо которой рекомендуется использовать go vet с определением поддержки внешних анализаторов кода через модуль analysis;

Добавлена поддержка ОС AIX 7.2 и более новых выпусков на системах с архитектурой POWER8 (aix/ppc64). Добавлена поддержка платформы Windows на системах с архитектурой ARM, например, Go теперь можно использовать на платах Raspberry Pi 3 с ОС Windows 10 IoT Core;

Для совместимости с будущими выпусками macOS и iOS задействована библиотека libSystem, выступающая прослойкой для выполнения специфичных для платформы Darwin системных вызовов;

Начиная с версии Go 1.13 будет прекращена поддержка macOS 10.10 "Yosemite", в качестве минимально поддерживаемой версии macOS станет 10.11 "El Capitan". В следующем выпуске также планируется прекратить поддержку ветки FreeBSD 10.x.

 

26.02.2019









 
архив

подписка