Сегодня, 16 августа 2016, вышел восьмой стабильный релиз языка программирования Go — Go 1.7. Как обычно, релиз выпущен по намеченному плану, через пол года после предыдущего, и в нём нет обратно несовместимых изменений. В тоже время, в Go 1.7 довольно много новых и важных изменений, уменьшены время компиляции и размеры бинарников, увеличена скорость работы и в стандартную библиотеку наконец-то добавлен пакет context. Под катом более подробный обзор новшеств и нововведений.


Новый SSA бекенд


Пожалуй, одним из важнейших изменений в этом релизе является использования нового бекенда компилятора, поддерживающего SSA-форму (Static Single-Assigment). Переход на SSA-бекенд даёт новые возможности для оптимизации и генерации более эффективного кода, и это уже можно наблюдать в данном релизе.


Чтобы сравнить результат компиляции старого и нового бекенда, достаточно передать параметр команде go build:


go build -gcflags="-ssa=0"

и для нового (SSA включён по-умолчанию в Go 1.7).


go build

Переход на новый бекенд уже сейчас даёт прирост в скорости программ от 5 до 35%.


Также можно покопаться в коде, генерируемом бекендом, с помощью переменной GOSSAFUNC:


GOSSAFUNC=main go build && open ssa.html


Новый формат метаданных


Хотя это изменение абсолютно невидимо для простых пользователей, его стоит упомянуть. В Go 1.7 используется новый формат экспорта метаданных в бинарных файлах, более компактный и эффективный, чем предыдущий. Он исправляет некоторые залежавшиеся баги и генерирует бинарные файлы меньшего размера. Его можно отключить параметром -newexport=0


go build -newexport=0

Поддержка MacOS X 10.12 'Sierra'


Хотя мы привычно ожидаем, что бинарники собранные с прыдыдущими версиями Go будут работать во всех будущих версиях различных OS — в случае с ещё не вышедшей MacOS X 10.12 это не так. В этом релизе MacOS была изменена реализация системного вызова gettimeofday(), а в Go, фактически используется копия её реализации, поэтому при её изменении в ядре, пришлось изменить код и в Go. Как это можно отразиться на практике — бинарники под MacOS X собранные с Go < 1.6.3 не будут корректно работать на MacOS X 10.12 'Sierra'. Если вы распространяете в бинарниках, убедитесь, что собираете их с Go 1.6.3 или 1.7, чтобы они корректно работали на MacOS X 10.12.


Оптимизация и ускорение компилятора и линкера


Помимо вышеупомянутых пунктов, оптимизации подверглось много компонентов стандартной библиотеки, компилятора и линкера, в результате чего бинарники должны быть меньше в размере на 20-30%, а код должен работать гораздо быстрее (особенно на x86-64 платформах), чем Go 1.6. При этом, благодаря новому бэкенду, остается еще много пространства для запланированных оптимизаций на следующие релизы.


Также в некоторых пакетах стандартной библиотеки оптимизации добавили более чем 10% ускорение — crypto/sha1, crypto/sha256, encoding/binary, fmt, hash/adler32, hash/crc32, hash/crc64, image/color, math/big, strconv, strings, unicode и unicode/utf16.


Также в программах с большим количеством запущенных горутин паузы сборщика мусора должны намного меньше.


Context


Одним из самых ожидаемых добавлений в стандартную библиотеку был перенос пакета golang.org/x/net/context в context. Из имени было убрано слово "net" потому что, хотя context и используется чаще всего в коде, работающим с запросами из сети, но его функционал не ограничен только работой с сетью. К примеру, он может использоваться для os/exec и других вещей.


Почему это важно? В Go появилось немало http-фреймворков и пакетов, задача которых была обеспечить передачу контекста внутри обработчиков входящих запросов. net/context постепенно начал занимать эту нишу, но теперь, с context в стандартной библиотеке и с нативной его поддержкой в пакетах net, net/http и os/exec, писать код, работающий с контекстами запроса будет гораздо проще и унифицированней.


В пакете net появился новый метод типа Dialer:


func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error)

Если таймаут контекста истекает раньше, чем произошло установление соединения, DialContext возвращает ошибку.


В net/http в типе Request появились методы Context() и WithContext():


func (r *Request) Context() context.Context

func (r *Request) WithContext(ctx context.Context) *Request

Метод Context() используется для получение контекста запроса, для его изменения используйте WithContext(). В исходящих запросах context теперь управляет отменой запроса.


Vendoring


В этом релизе переменная GO15VENDOREXPERIMENT больше не поддерживается, теперь вендоринг это стандартный функционал тулинга Go.


Testing


В пакете testing, который используется для написания тестов, появилась поддержка вложенных иерархических тестов и бенчмарков. Это бывает очень удобно для BDD-тестирования, табличных тестов и для более компактной организации тестов в целом. Пример кода:


func TestTeardownParallel(t *testing.T) {
    // This Run will not return until the parallel tests finish.
    t.Run("group", func(t *testing.T) {
        t.Run("Test1", parallelTest1)
        t.Run("Test2", parallelTest2)
        t.Run("Test3", parallelTest3)
    })
    // <tear-down code>
}

Детали доступны в документации к пакету: https://golang.org/pkg/testing/#hdr-Subtests_and_Sub_benchmarks


Разное


  • go tool trace теперь не требует бинарник для анализа трейса, и оверхед на трейсинг уменьшился с 400% до 20%
  • в стандартную библиотеку включён простой zipkin-аналог инструмент httptrace — net/http/httptrace/
  • os/user.Current больше не требует cgo (таким образом, осталось 3 места, где cgo всё ещё используется в стандартной библиотеке)

Полный список изменений доступен тут: https://golang.org/doc/go1.7


Стоит ли мне обновляться?


Обычно никаких рисков с обновлением на новый релиз нет, и в Go коммьюнити свежая версия используется большинством. Но есть смысл первые пару недель подождать, потестировать билды на 1.7 в тестовом режиме. В последних двух релизах были минорные релизы (1.5.1 и 1.6.1) с исправлениями очень специфических багов, найденных в первые недели после основного релиза.


Ссылки


https://golang.org/doc/go1.7
https://golang.org/dl/


PS. В этом релизе приняли участие 170 человек, из которых 140 — не из Google, а из Go сообщества.

Поделиться с друзьями
-->

Комментарии (24)


  1. pengyou
    16.08.2016 13:58
    -1

    Go подбирается к 2.0, нет ли новостей о планируемых изменениях?


    1. divan0
      16.08.2016 14:17
      +9

      После Go 1.9 будет Go 1.10, потом Go 1.11 и т.д. Go 2.0 в планах нет.


      1. shpaker
        16.08.2016 15:04
        -1

        Это достоверно или просто предположение?


        1. Rivethead
          16.08.2016 15:16

          На одной из конференций озвучивали. Ну и сказали, что в самом языке изменений уже можно не ждать, он стабилизирован. Расширение самого языка будет происходить пакетами.


        1. Mad__Max
          14.12.2016 18:15

          Хм, а в OLED тогда как? Там же именно ток через светодиоды меняют. Причем без проблем получается это делать в очень широких пределах и на порядок быстрее чем с ЖК управляемым напряжением.

          Или как раз из-за этого OLED и так дороги и мало распространены пока? Я просто думал, что в них основная сложность/дороговизна именно в самих светоизлучающих диодах, а не управлении ими.


      1. Diaskhan
        16.08.2016 15:05
        -2

        Вот это меня и разджражает, почему после версии 0,9 бета идет релиз 1,0
        А после 1,9 почему то идет 1,10 не разумнее ли тогда сделать 1,09 или 1,1 Каждый релизит название версий по своему усмотрению…


        1. shpaker
          16.08.2016 15:07
          +4

          Дык 10 после 9 это прям логично) Да и никто не может на пару лет вперед загадывать количество апдейтов)


        1. dvor
          16.08.2016 15:12
          +5

          После 0.9 версии идет 0.10, а потом 0.11. В случае же, если после 0.9 релиз готов, выпускают 1.0.

          См. semver.org


        1. wing_pin
          16.08.2016 15:18

          Нет, не разумней. Почитайте про семантическое версионирование.


    1. ivahaev
      16.08.2016 15:18

      https://github.com/golang/go/milestones

      Тут пока ничего, да и в этой версии работы ещё дофига.


  1. Strain
    16.08.2016 18:10
    +1

    А generics уже добавили?


    1. softaria
      16.08.2016 18:20
      +1

      нет


      1. Strain
        16.08.2016 18:21
        -2

        печаль ((


        1. pengyou
          16.08.2016 20:04
          -4

          Почему?


          1. Strain
            16.08.2016 20:12
            +5

            Да может скоро придётся проект чужой допиливать на go.
            Нет generics — очень плохо, но можно пережить — правда тогда нужны хорошие макросы, а их ведь тоже нет.


            1. pengyou
              16.08.2016 20:54
              -5

              Почему нужны?


              1. pengyou
                18.08.2016 10:14
                -1

                Люблю наблюдать, как простые вопросы инициируют эмоциональный срыв у всяких умников. Ради такого не жалко кармы.


        1. serge-phi
          17.08.2016 14:05
          +1

          Ввиду наличия в Го встроенных динамических массивов, ассоциативных массивов и каналов, отсутствие генериков не сильно напрягает.


  1. semyonDV
    17.08.2016 14:07
    -4

    Когда ООП завезут?


    1. pengyou
      17.08.2016 14:15

      А что такое ООП в вашем понимании?


    1. softaria
      17.08.2016 16:45
      +2

      Вы хотите, чтобы из Go сделали Java? Так java уже есть.
      В Go ООП присутствует, хотя и переомысленный и довольно специфический.
      Кстати, довольно удобный на практике.


  1. Crandel
    18.08.2016 10:00

    После обновления до 1.7 в Arch linux любой docker контейнер основанный на postgres выдает


    docker: Error response from daemon: Container command '/docker-entrypoint.sh' not found or does not exist.


    1. Crandel
      18.08.2016 10:35

      Проблема была не в go а в containerd версии 0.2.3, не обновляйтесь пока


  1. softaria
    18.08.2016 12:54
    +1

    Обновил go в своей многопользовательской игре (сервер).
    Результат — примерно на 30% меньше ест процессорного времени.
    И, главное, теперь можно не отключать GC! Его работа больше не тормозит игру.
    Это очень, очень здорово!