В этой версии было сделано множество серьезных изменений в реализации языка. Компилятор и рантайм был транслирован с C на Go, убрав последние остатки C из кодовой базы Go. Сборщик мусора был полностью переписан, что позволило уменьшить паузы во время сборки мусора на порядки. Сопутствующие изменения в планировщике рантайма, позволили нам изменить значение GOMAXPROCS (количество одновременно исполняющихся горутин) с 1 до количества логических CPU. Изменения в линкере позволили распространять Go пакеты в виде динамических библиотек, которые можно линковать как с Go, так и с C программами (дизайн).
(первая часть является вольным переводом анонса в блоге Go от Andrew Gerrand — blog.golang.org/go1.5)
Данный релиз также включает в себя улучшения в инструменты разработки Go. Поддержка «внутренних» пакетов позволяет шарить имплементацию между пакетами. Экспериментальная поддержка вендоринга внешних зависимостей станет шагом вперед в стандартизации способа управления внешними зависимостями в Go. Новая утилита «go tool trace» позволяет визуализировать ход выполнения программы в мельчайших деталях прямо во время исполнения. Новый «go doc» дает более удобный интерфейс командной строки для просмотра документации Go.
Также добавлено несколько новых поддерживаемых систем и архитектур. Самыми зрелыми из них являются darwin/arm и darwin/arm64 (Apple iPhone и iPad) и linux/arm64. Также добавилась экспериментальная поддержка ppc64 и ppc64le (IBM 64-bit, bit/little endian).
Поддержка darwin/arm64 и новый функционал динамической линковки является ключевым для проекта Go mobile — эксперимента для создания приложений под Android и IOS. (Go mobile сам по себе не является частью этого релиза, это отдельный проект).
Единственное изменение в языке (обратно-совместимое, разумеется) — это уменьшение ограничений на литералы для map, это позволяет сделать их гораздо более читабельными и удобными в ряде случаев.
Стандартная библиотека также получила массу улучшений и добавлений. Пакет flag теперь показывает вывод usage-сообщения гораздо более красиво. В пакет math/big добавилася тип Float для работы с большими числами с плавающей точкой произвольной точности. Улучшение в DNS-резолвере для Linux и BSD-систем позволило отвязаться от CGO для программ, которым нужен был DNS. Пакет go/types переехал в стандартную библиотеку из golang.org/x/tools репозитория. (Пакеты go/constant и go/importer переехали аналогично). В пакете reflect добавились функции ArrayOf и FuncOf, по аналогии с уже существующей SliceOf. И, конечно, целый список более мелких исправлений и улучшений.
Все подробности и детали релиза вы может найти на странице релиза. Скачать релиз для вашей системы можно тут.
Установка
Если вы решили поставить Go 1.5, то процедура установки такая же, как всегда — на официальной странице golang.org/dl скачиваете свой установщик, или .tar.gz-архив с бинарниками, или исходники — как вам удобнее. Первый метод предпочтительней.
Если же вы хотите оставить предыдущий релиз (Go 1.4) и иметь возможность на лету переключаться между предыдущим и свежим релизом (к примеру, для сравнения сборок для версий), то проще всего скачать бинарные .tar.gz пакеты и распаковать в (стандартную) /usr/local:
$ ls /usr/local/go*
go142
go15
и создать симлинк на /usr/local/go для нужной версии. Это легко обернуть в алиас или скрипт, при надобности.
$ cd /usr/local
$ ln -nfs go142 go
$ ln -nfs go150 go
Ссылки
golang.org/doc/go1.5
blog.golang.org/go1.5
Комментарии (25)
Londoner
20.08.2015 00:58-9А с MVC-фреймворками всё так же печально, как было?
sentyaev
20.08.2015 01:13+4Во первых с ними все хорошо.
А во вторых они в Go не особо нужны, все работает из коробки.Londoner
20.08.2015 23:14Тогда как на Go сделать то же самое что на Python+Django или Scala+Play2?
sentyaev
21.08.2015 01:02+1Я, к сожалению, не знаю какую именно задачу вы хотите решить.
Вот например REST сервис на Go + Mongodb очень приятно писать.
Еще есть же куча различных framework'ов: ASP.NET, JavaEE, RoR, тут можно с десяток-другой перечислить, и все будут отличными.
Как раз выбор языка и framework зависит от задачи которую вы решаете.
Если у вас enterprise, то ASP.NET или JavaEE, без вариантов (в 90-95% случаев).
Если стартап… тут уж вам решать, все равно, если дело пойдет, придется переписывать.
Не нужно пытыться решать все задачи одним инструментом.
gurinderu
20.08.2015 09:48+3Ребят, где можно подробнее почитать про алгоритмы GC, которые реализованы в Go? Очень интересно.
Alex_At_Net
20.08.2015 12:29тут github.com/golang/go (шутка :-)
вот тут немножко — golang.org/s/go15gcpacing
ingrysty
20.08.2015 12:31+6На русском обсуждалось в подкасте по Go — http://golangshow.com/episode/2015/07-30-009/
gurinderu
21.08.2015 12:17-3Alex_At_Net youROCK
спасибо за ссылки, но данные документы не отвечают на мои вопросы, а скорее добавляют новых
ingrysty
Благодарю, хоть и в большинстве случае разговоры данного подкаста вызывали у меня facepalm, но ответ на вопрос о алгоритме я получил. Стало понятно, что ничего нового они не придумали в этой области. Остался вопрос, можно ли настраивать выбор GC в GO как это сделано в Java?
P.S. для тех кто не хочет слушать подкаст скажу что go использует concurrent mark-sweep. В общем в области сборки мусора все по старому, новых алгоритмов пока никто не придумал)
ptitca_zu
Я правильно понял, что наконец-то динамическая линковка появилась?
divan0
Именно. Но причины её появления больше вынужденные — для упаковки отдельных пакетов в linux-дистрибутивы (в deb/rpm/etc) и для Go mobile нужно было.
js605451
Да пофигу какие там причины, наконец-то можно делать .so на Go, это же здорово.