Сегодня (прим. переводчика: 24-08-2017), наша команда рада Вам представить релиз Go 1.9. Вы можете скачать его отсюда. В этом релизе очень много изменений касательно самого языка, стандартных библиотек, райнтайма и инструментов экосистемы. В этом посте я расскажу Вам о наиболее значимых из них. Наибольшее усилие в этом релизе было приложено на усовершенствование рантайма и инструментов экосистемы, что делает анонс менее интересным, но релиз более великолепным.

Самое важное изменение в языке — это алиасы для типов: фича, созданная для постепенного восстановления кода. Алиасы типов представляются в следующем виде:

type T1 = T2

Это объявление создает алиас T1 для типа T2, тем же способом как byte является алиасом для uint8. Архитектура алисов для типов описана в документе, а статья о рефакторниге охватывает эту тему еще более детально.

Новый пакет math/bits предоставляет функции подсчета и манипуляции для беззнаковых целых чисел, использующие специальные инструкции CPU, где это возможно. Для примера: на x86-64 системах, bits.TrailingZeros(x) использует BSF инструкции.

В пакет sync добавился новый тип Map, безопасный для конкурентного доступа (потоко-безопасный). Вы можете прочитать об этом больше в документации к типу и узнать больше о создании данного типа с доклада на GopherCon 2017 (слайды). Map не является заменой для встроенного в Go типа ассоциативных массивов; пожалуйста прочитайте соответствующую документацию чтобы получить понимание и представления для каких целей использовать Map.

Также свою порцию добавки получил пакет testing. Новый метод Helper был добавлен в testing.T и testing.B, помечающий вызываемую функцию как тестовую вспомогательную функцию. Когда тестовый пакет выводит информацию о файле и строке, он показывает место вызова вспомогательной функции вместо того чтобы показывать строку в самой вспомогательной тестовой функции.

Для примера, рассмотрим следующий тест:

package p

import "testing"

func failure(t *testing.T) {
    t.Helper() // This call silences this function in error reports.
    t.Fatal("failure")
}

func Test(t *testing.T) {
    failure(t)
}

Так как, failure идентифицирует себя как вспомогательная тестовая функция, сообщения об ошибке выводимое во время выполнения Test будет указывать на строку 11, где вызывается failure, вместо строки 7, где failure вызывает t.Fatal.

Пакет time теперь прозрачно отслеживает «монотонное» время (прим. переводчика: отсылка к типам времени предоставляемым ОС) в значении Time, делая вычисление времени выполнения между двумя вызовами (значениями) Time безопасной операцией, даже в присутствии обычных часов ОС (синхронизация часов ОС). Для примера, следующий кусок кода вычисляет точное время выполнения, даже если синхронизации обычных часов произойдет в течении одной секунды:

start := time.Now()
f()
elapsed := time.Since(start)

Смотрите документацию к пакету и документы к дизайну (архитектуре) для более подробной информации.

И напоследок, как часть усилий направленных чтобы сделать компилятор Go еще более быстрым, в Go 1.9 функции внутри пакета компилируется конкурентно (параллельно, одновременно).

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

Чтобы отпраздновать новый релиз, сообщество пользователей Go устраивает вечерники, приуроченные к релизу по всему миру.

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


  1. dronnix
    25.08.2017 12:58
    +1

    Здорово, что появился sync/Map, но вот тонкости когда его использовать, а когда нет — это немного не в духе Go.


  1. houk Автор
    25.08.2017 13:16

    но вот тонкости когда его использовать, а когда нет — это немного не в духе Go.
    Поясните пожалуйста =)


    1. houk Автор
      25.08.2017 13:21

      не хочу заводить флейм, просто ваш комментарий (что в духе и не в духе Go) заинтриговал меня


  1. ertaquo
    25.08.2017 13:53
    +3

    А мне очень-очень хотелось бы, чтобы в языке наконец появились значения по умолчанию для аргументов функций и полей структур. Это было бы дико удобно.


    1. KosToZyB
      25.08.2017 14:23
      -2

      Но иногда это плохо для поддержки кода, когда надо добавить параметров к функции.


      1. ertaquo
        26.08.2017 12:57

        Тут тоже варианты есть. Можно было бы попробовать как-нибудь так:

        func SomeFunc(a int, b int = 10, c int = 20) { ... }
        SomeFunc(5, c = 40);

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


    1. quasilyte
      25.08.2017 23:33
      -1

      Proposal для Go 2 написали? :)
      Возможно такой уже есть, надо искать.

      Если хорошо расписать, то какой-то минимальный шанс на значения по умолчанию для структур есть.
      Насчёт параметров функций по умолчанию не уверен. Не упаковывал бы
      это всё в один proposal.


  1. UncleAndy
    25.08.2017 15:12

    Насколько я понял, обратная совместимость сохранилась?


    1. Proxeter
      25.08.2017 15:40
      +1

      В статье данная часть отсутствует, но в описании к релизу есть:
      «As always, the release maintains the Go 1 promise of compatibility. We expect almost all Go programs to continue to compile and run as before.»


  1. unsafePtr
    25.08.2017 17:41

    Недавно была статья на хабре про сравнение async/await с корутинами го. Я не специалист, но заинтерисовало что такое корутины, и как они работают в Go. Если кто хорошо разбирается, возможно сможет улучшить статью, добавив в комментарии улучшунный код на го. Хочется понять с точки зрения асинхронности, когда лучше использовать корутины(то есть когда они будут быстрее). Сам лично набрел на пост в стековерфлоу, что хорошо спроектированное приложение, использующее потоки всегда будет быстрее файберов(именно они используется в основе корутин, если я правильно понял). Асинхронный код в c# писать легко, однако, если нужна будет скорость, можно запутатся во множестве деталей. Ну и поздравляю приверженцев Go с выходом новой версии.


    1. l0rda
      25.08.2017 19:48
      -1

      Гороутины же :)


  1. Sjam
    25.08.2017 18:32

    Печалит отказ от ppc. Хочется некоторое ПО на go на NAS поставить. А не выходит.


    1. danfe
      25.08.2017 20:04

      А где именно об этом написано? В релизнотесах вижу, что ppc64x now requires at least POWER8 support, а вот упоминания ppc32 не вижу. Не там смотрю?


      1. Sjam
        26.08.2017 09:56

        В том и дело, что поддержка только ppc64.


  1. QtRoS
    25.08.2017 21:58

    Go радует тем, что изменения в новых версиях очень обдуманные и осторожные. Не возникает чувства, что ты больше не знаешь язык.


  1. Hydro
    26.08.2017 09:12
    -1

    это алисы для типов:

    Алисы -> Алиасы


    1. houk Автор
      26.08.2017 09:56

      Спасибо. Исправил.


  1. divanus
    26.08.2017 12:36
    -6

    Нахрена мне Go?


  1. divanus
    26.08.2017 16:17
    -9

    А чего сразу в минуса? Вот я хочу знать, зачем он мне? И такие сразу жмяк жмяк дизлайк… :) Так профессионально ответили, сразу ясно, что школота дизлайкает после ночной вписки.


    1. lain8dono
      26.08.2017 18:00

      Если занимаетесь серверным ПО: легко читаемый синтаксис, жрёт мало памяти, удобный инструментарий. Ежели занимаетесь десктопным ПО, фронтэндом, мобилками, встроенным ПО — 95%, что не нужен. Вас устроит этот ответ? В таком случае минусы не ставлю, но от вписочки школьной не отказался бы :3


      1. pawlo16
        26.08.2017 19:02
        +1

        Для десктопа тоже можно — github.com/lxn/walk весьма не плоха
        фронтенд с gopherjs так же довольно приятно готовить


      1. divanus
        26.08.2017 21:52
        -4

        Вот, адекватный ответ. Благодарю. Минусаторы так и остались школотой и не смогли ответить.


    1. pawlo16
      26.08.2017 20:04
      +5

      зачем он мне?

      • простой синтаксис и go fmt


      • нормальное ООП на интерфейсах. чтобы реализовать для типа интерфейс, не надо менять тип


      • нет убийц времени — эксепшнов, наследования, перегрузки операторов и функций, конструкторов, неявных преобразований типов и т.п.


      • всё, что нужно, есть в стандартной библиотеке искаропки. На вскидку — http сервер c http/2.0 и tls, https без использования OpenSSL, поддержка автоматического получения и обновления TLS-сертификатов, сериализатор asn, data-driven шаблоны для генерации форматированного вывода, парсеры, синт.анализаторы. Не надо на любой чих мучительно искать очередную маргинальную библиотеку от непонятно кого.


      • поддержка всех необходимых средств для тестирования и замеров производительности out of the box. Профилирование можно включать/отключать удаленно в продакшн в любой момент времени, и это не снизит существенно скорость программы.


      • сверхбыстрый быстрый GC — паузы не превышают 100 микросекунд на любом размере хипа. Для сравнения STW паузы в net core зависят от настроек GC и размера хипа, и измерены в районе 100 миллисекунд. В 1.9 GC ещё и параллельная сборка мусора добавлена


      • горуитины повышают перформанс и упрощают разработку — линейный синхронный код vs. асинхронщина, в которую ни кто толком не умеет.


      • кросс-платформенная компиляция out of the box и сборка программы в один самодостаточный бинарник без внешних зависимостей избавляет от dll hell, dependency hell и костылей в виде docker-а. Бинарник Гоу весит мало, потребляет память скромно и ему для запуска не нужна виртуальная машина внушительного размера на подобие JVM.


      • высокая скорость компиляции — существенно выше чем в C#, Java, Rust не говоря уже о C++ и Scala


      1. divanus
        26.08.2017 22:05
        -3

        Вот еще один адекватный ответ. Благодарю.


  1. kemsky
    26.08.2017 21:17

    Я только недавно начал изучать Go, однако сразу бросилось в глаза его сходство с PureBasic. С большего, это два Си-подобных языка, кроссплатформенные, не имеют классов в явном виде. Единственное, что в PureBasic нету корутин и GC, но в то же время у него богаче стандартная библиотека, есть поддержка UI. Удивительно.



  1. EvilFox
    27.08.2017 01:21
    -1

    промахнулся


  1. claygod
    29.08.2017 16:36

    В пакет sync добавился новый тип Map
    Посмотрел описание на сайте Go и не вполне понял (есть сомнения) следующее:
    It is optimized for use in concurrent loops with keys that are stable over time, and either few steady-state stores, or stores localized to one goroutine per key.