Релиз Go 1.9

https://blog.golang.org/go1.9
  • Перевод
Сегодня (прим. переводчика: 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
    Здорово, что появился sync/Map, но вот тонкости когда его использовать, а когда нет — это немного не в духе Go.
      0
      но вот тонкости когда его использовать, а когда нет — это немного не в духе Go.
      Поясните пожалуйста =)
        0
        не хочу заводить флейм, просто ваш комментарий (что в духе и не в духе Go) заинтриговал меня
        +3
        А мне очень-очень хотелось бы, чтобы в языке наконец появились значения по умолчанию для аргументов функций и полей структур. Это было бы дико удобно.
          –2
          Но иногда это плохо для поддержки кода, когда надо добавить параметров к функции.
            0
            Тут тоже варианты есть. Можно было бы попробовать как-нибудь так:
            func SomeFunc(a int, b int = 10, c int = 20) { ... }
            SomeFunc(5, c = 40);

            Афайк, внутри компилятора аргументы функций и структуры хранятся одинаково. Только такой синтаксис реализовать сложнее будет.
            –1
            Proposal для Go 2 написали? :)
            Возможно такой уже есть, надо искать.

            Если хорошо расписать, то какой-то минимальный шанс на значения по умолчанию для структур есть.
            Насчёт параметров функций по умолчанию не уверен. Не упаковывал бы
            это всё в один proposal.
            0
            Насколько я понял, обратная совместимость сохранилась?
              +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.»
              0
              Недавно была статья на хабре про сравнение async/await с корутинами го. Я не специалист, но заинтерисовало что такое корутины, и как они работают в Go. Если кто хорошо разбирается, возможно сможет улучшить статью, добавив в комментарии улучшунный код на го. Хочется понять с точки зрения асинхронности, когда лучше использовать корутины(то есть когда они будут быстрее). Сам лично набрел на пост в стековерфлоу, что хорошо спроектированное приложение, использующее потоки всегда будет быстрее файберов(именно они используется в основе корутин, если я правильно понял). Асинхронный код в c# писать легко, однако, если нужна будет скорость, можно запутатся во множестве деталей. Ну и поздравляю приверженцев Go с выходом новой версии.
                –1
                Гороутины же :)
                0
                Печалит отказ от ppc. Хочется некоторое ПО на go на NAS поставить. А не выходит.
                  0
                  А где именно об этом написано? В релизнотесах вижу, что ppc64x now requires at least POWER8 support, а вот упоминания ppc32 не вижу. Не там смотрю?
                    0
                    В том и дело, что поддержка только ppc64.
                  0
                  Go радует тем, что изменения в новых версиях очень обдуманные и осторожные. Не возникает чувства, что ты больше не знаешь язык.
                    –1
                    это алисы для типов:

                    Алисы -> Алиасы
                      0
                      Спасибо. Исправил.
                      –6
                      Нахрена мне Go?
                        –9
                        А чего сразу в минуса? Вот я хочу знать, зачем он мне? И такие сразу жмяк жмяк дизлайк… :) Так профессионально ответили, сразу ясно, что школота дизлайкает после ночной вписки.
                          0
                          Если занимаетесь серверным ПО: легко читаемый синтаксис, жрёт мало памяти, удобный инструментарий. Ежели занимаетесь десктопным ПО, фронтэндом, мобилками, встроенным ПО — 95%, что не нужен. Вас устроит этот ответ? В таком случае минусы не ставлю, но от вписочки школьной не отказался бы :3
                            +1
                            Для десктопа тоже можно — github.com/lxn/walk весьма не плоха
                            фронтенд с gopherjs так же довольно приятно готовить
                              –4
                              Вот, адекватный ответ. Благодарю. Минусаторы так и остались школотой и не смогли ответить.
                              +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
                                –3
                                Вот еще один адекватный ответ. Благодарю.
                              0

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

                              –1
                              промахнулся
                                0
                                В пакет 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.

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

                                Самое читаемое