Сегодня, 19 августа 2015, проект Go с гордостью представляет Go 1.5 — шестой стабильный релиз языка Go.



В этой версии было сделано множество серьезных изменений в реализации языка. Компилятор и рантайм был транслирован с C на Go, убрав последние остатки C из кодовой базы Go. Сборщик мусора был полностью переписан, что позволило уменьшить паузы во время сборки мусора на порядки. Сопутствующие изменения в планировщике рантайма, позволили нам изменить значение GOMAXPROCS (количество одновременно исполняющихся горутин) с 1 до количества логических CPU. Изменения в линкере позволили распространять Go пакеты в виде динамических библиотек, которые можно линковать как с Go, так и с C программами (дизайн).

(первая часть является вольным переводом анонса в блоге Go от Andrew Gerrandblog.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)


  1. ptitca_zu
    19.08.2015 22:33
    +2

    Изменения в линкере позволили распространять Go пакеты в виде динамических библиотек, которые можно линковать как с Go, так и с C программам

    Я правильно понял, что наконец-то динамическая линковка появилась?


    1. divan0
      19.08.2015 22:34

      Именно. Но причины её появления больше вынужденные — для упаковки отдельных пакетов в linux-дистрибутивы (в deb/rpm/etc) и для Go mobile нужно было.


      1. js605451
        20.08.2015 01:54
        +8

        Да пофигу какие там причины, наконец-то можно делать .so на Go, это же здорово.


  1. Londoner
    20.08.2015 00:58
    -9

    А с MVC-фреймворками всё так же печально, как было?


    1. sentyaev
      20.08.2015 01:13
      +4

      Во первых с ними все хорошо.
      А во вторых они в Go не особо нужны, все работает из коробки.


      1. Londoner
        20.08.2015 23:14

        Тогда как на Go сделать то же самое что на Python+Django или Scala+Play2?


        1. sentyaev
          21.08.2015 01:02
          +1

          Я, к сожалению, не знаю какую именно задачу вы хотите решить.
          Вот например REST сервис на Go + Mongodb очень приятно писать.
          Еще есть же куча различных framework'ов: ASP.NET, JavaEE, RoR, тут можно с десяток-другой перечислить, и все будут отличными.
          Как раз выбор языка и framework зависит от задачи которую вы решаете.
          Если у вас enterprise, то ASP.NET или JavaEE, без вариантов (в 90-95% случаев).
          Если стартап… тут уж вам решать, все равно, если дело пойдет, придется переписывать.
          Не нужно пытыться решать все задачи одним инструментом.


        1. divan0
          21.08.2015 01:11

          Посмотрите на Revel или Beego.


  1. ingrysty
    20.08.2015 02:18
    -9

    Раст все еще лучше Go, даже по конкуррентности.


    1. sayber
      20.08.2015 03:19
      +6

      1) Пост о Go и ваш Rust тут не нужен нафиг
      2) Кто вам сказал такую глупость


      1. alist
        20.08.2015 09:52
        +12

        ingrysty — гофер и друг автора статьи, а комментарий — дружеская шутка. А Раст на самом деле люблю я, а не они.


        1. ingrysty
          20.08.2015 12:23
          +6

          Зато зашло, целых -18 :)


    1. aml
      20.08.2015 09:14
      +5

      Напишите, пожалуйста, статью про это.


  1. bolk
    20.08.2015 09:15
    +9

    Шарить имплементацию!

    Ньювый рашевый лэнгвич.


    1. divan0
      20.08.2015 16:07

      Ну, если подскажете удачный перевод, буду благодарен.


      1. bolk
        20.08.2015 17:51

        Так это вообще не перевод.

        Поддержка «внутренних» пакетов позволяет делить часть кода между пакетами.


        1. divan0
          20.08.2015 18:17

          Нет, «share implementation» это не «делить часть кода». Скорее, «разделять реализацию», хотя тоже смысл не передает.


          1. bolk
            20.08.2015 18:25

            Это именно «делить часть кода». А «разделять реализацию» — вообще буквальный перевод и имеет в точности тот же смысл.


      1. vsb
        20.08.2015 18:48

        делить/разделять реализацию/код


  1. gurinderu
    20.08.2015 09:48
    +3

    Ребят, где можно подробнее почитать про алгоритмы GC, которые реализованы в Go? Очень интересно.


    1. Alex_At_Net
      20.08.2015 12:29

      тут github.com/golang/go (шутка :-)
      вот тут немножко — golang.org/s/go15gcpacing


    1. ingrysty
      20.08.2015 12:31
      +6

      На русском обсуждалось в подкасте по Go — http://golangshow.com/episode/2015/07-30-009/



  1. gurinderu
    21.08.2015 12:17
    -3

    Alex_At_Net youROCK
    спасибо за ссылки, но данные документы не отвечают на мои вопросы, а скорее добавляют новых

    ingrysty
    Благодарю, хоть и в большинстве случае разговоры данного подкаста вызывали у меня facepalm, но ответ на вопрос о алгоритме я получил. Стало понятно, что ничего нового они не придумали в этой области. Остался вопрос, можно ли настраивать выбор GC в GO как это сделано в Java?

    P.S. для тех кто не хочет слушать подкаст скажу что go использует concurrent mark-sweep. В общем в области сборки мусора все по старому, новых алгоритмов пока никто не придумал)


    1. ingrysty
      21.08.2015 13:57

      Updated.
      Не правильно понял комментарий.