Представлен (https://blog.golang.org/go1.12) релиз языка программирования Go 1.12 (http://golang.org), который развивается компанией Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как лёгкость написания кода, быстрота разработки и защищённость от ошибок. Код проекта распространяется (https://golang.org/dl/) под лицензией BSD. Синтаксис Go основан на привычных элементах языка Си с отдельными заимствованиями из языка Python. Язык достаточно лаконичен, но при этом код легко читается и воспринимается. Код на языке Go компилируется в обособленные бинарные исполняемые файлы, выполняемые нативно без использования виртуальной машины (модули профилирования, отладки и другие подсистемы выявления проблем на этапе выполнения интегрируются в виде runtime-компонентов (http://golang.org/pkg/runtime/)), что позволяет добиться производительности, сопоставимой с программами на языке Си.
Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах, в том числе предоставляя реализованные на уровне операторов средства для организации параллельных вычислений и взаимодействия между параллельно выполняемыми методами. Язык также предоставляет встроенные средства защиты от выхода за допустимые области выделенных блоков памяти и обеспечивает возможность использования сборщика мусора.
Основные новшества (http://golang.org/doc/go1.12), представленные в выпуске Go 1.12:
- В пакет crypto/tls добавлена реализация протокола TLS 1.3 (https://www.opennet.ru/opennews/art.shtml?num=49126).
В реализации пока отсутствует поддержка режима 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 (https://en.wikipedia.org/wiki/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 (https://golang.org/x/tools/go/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.
URL: https://blog.golang.org/go1.12
Новость: https://www.opennet.ru/opennews/art.shtml?num=50210