Вчера состоялся выпуск языка программирования Go 1.4. Go — это компилируемый императивный язык программирования, созданный Робертом Гризмером, Робом Пайком и Кеном Томпсоном в компании Google как более удобная и безопасная альтернатива C++. Сейчас у него тысячи пользователей по всему миру, на нём написаны такие открытые проекты, как Docker или Ubuntu Juju, а также многие серверные приложения, особенно для внутрикорпоративного использования. В ноябре языку исполнилось пять лет.
Одна из главных новостей: компилятор gc теперь поддерживает платформу Android. Библиотеки пока ещё не готовы, но уже можно писать простые приложения целиком на Go. Кроме того, добавлена поддержка NaCl на процессорах ARM и Plan 9 на AMD64.
В новом выпуске сделано два изменения синтаксиса. Во-первых, разрешено писать цикл с range таким образом:
for range x {
...
}
for _ = range x {
...
}
Второе изменение в том, что при вызове методов теперь допускается не более одного неявного разыменования. То есть если раньше можно было написать так:
type T int
func (T) M() {}
var x **T
x.M() //!!!
В утилите go появилась команда generate, которая запускает внешние программы (например, yacc) для автоматической генерации файлов .go. Если некоторые файлы в пакете нужно сгенерировать из других файлов, то теперь с помощью специальных комментариев в файлах, написанных вручную, можно заставить go build вызывать go generate с нужными опциями перед сборкой. Таким образом можно реализовать, например, генерацию схожих функций для разных типов без использования дженериков. В go также добавлена команда stringer, которая позволяет быстро создавать метод String() для типов (чтобы удовлетворить fmt.Stringer).
Кроме того, утилита go теперь позволяет указывать «канонические пути» для импорта пакетов: если для пакета указан канонический путь, но где-то в программе он импортируется прямо из интернета по другому пути, то программа не скомпилируется. Добавлена сокращённая форма для импорта субрепозиториев. Слегка изменена ожидаемая структура каталогов в дереве исходников.
Большая часть стандартной библиотеки транслирована в Go. Приложения это, скорее всего, напрямую не затронет, но теперь сборщик мусора будет быстрее узнавать, когда можно удалять объекты, ему не придётся держать их в памяти понапрасну, и потребление памяти сократится на 10-30%.
О прочих, менее значительных изменениях можно прочитать в информации о выпуске.
Кроме того, начиная с выпуска 1.4 разработчики перешли с Mercurial на Git и Gerrit, а скоро планируют переехать с googlesource.com на Github (сейчас там работает зеркало). Go 1.4 доступен на Google AppEngine для бета-тестирования. Тем временем компилятор GCC 4.9 поддерживает только Go 1.2, а поддержка Go 1.4 ожидается в GCC 5.