Самое важное изменение в языке — это алиасы для типов: фича, созданная для постепенного восстановления кода. Алиасы типов представляются в следующем виде:
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)
ertaquo
25.08.2017 13:53+3А мне очень-очень хотелось бы, чтобы в языке наконец появились значения по умолчанию для аргументов функций и полей структур. Это было бы дико удобно.
KosToZyB
25.08.2017 14:23-2Но иногда это плохо для поддержки кода, когда надо добавить параметров к функции.
ertaquo
26.08.2017 12:57Тут тоже варианты есть. Можно было бы попробовать как-нибудь так:
func SomeFunc(a int, b int = 10, c int = 20) { ... } SomeFunc(5, c = 40);
Афайк, внутри компилятора аргументы функций и структуры хранятся одинаково. Только такой синтаксис реализовать сложнее будет.
quasilyte
25.08.2017 23:33-1Proposal для Go 2 написали? :)
Возможно такой уже есть, надо искать.
Если хорошо расписать, то какой-то минимальный шанс на значения по умолчанию для структур есть.
Насчёт параметров функций по умолчанию не уверен. Не упаковывал бы
это всё в один proposal.
UncleAndy
25.08.2017 15:12Насколько я понял, обратная совместимость сохранилась?
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.»
unsafePtr
25.08.2017 17:41Недавно была статья на хабре про сравнение async/await с корутинами го. Я не специалист, но заинтерисовало что такое корутины, и как они работают в Go. Если кто хорошо разбирается, возможно сможет улучшить статью, добавив в комментарии улучшунный код на го. Хочется понять с точки зрения асинхронности, когда лучше использовать корутины(то есть когда они будут быстрее). Сам лично набрел на пост в стековерфлоу, что хорошо спроектированное приложение, использующее потоки всегда будет быстрее файберов(именно они используется в основе корутин, если я правильно понял). Асинхронный код в c# писать легко, однако, если нужна будет скорость, можно запутатся во множестве деталей. Ну и поздравляю приверженцев Go с выходом новой версии.
Sjam
25.08.2017 18:32Печалит отказ от ppc. Хочется некоторое ПО на go на NAS поставить. А не выходит.
QtRoS
25.08.2017 21:58Go радует тем, что изменения в новых версиях очень обдуманные и осторожные. Не возникает чувства, что ты больше не знаешь язык.
divanus
26.08.2017 16:17-9А чего сразу в минуса? Вот я хочу знать, зачем он мне? И такие сразу жмяк жмяк дизлайк… :) Так профессионально ответили, сразу ясно, что школота дизлайкает после ночной вписки.
lain8dono
26.08.2017 18:00Если занимаетесь серверным ПО: легко читаемый синтаксис, жрёт мало памяти, удобный инструментарий. Ежели занимаетесь десктопным ПО, фронтэндом, мобилками, встроенным ПО — 95%, что не нужен. Вас устроит этот ответ? В таком случае минусы не ставлю, но от вписочки школьной не отказался бы :3
pawlo16
26.08.2017 19:02+1Для десктопа тоже можно — github.com/lxn/walk весьма не плоха
фронтенд с gopherjs так же довольно приятно готовить
divanus
26.08.2017 21:52-4Вот, адекватный ответ. Благодарю. Минусаторы так и остались школотой и не смогли ответить.
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
kemsky
26.08.2017 21:17Я только недавно начал изучать Go, однако сразу бросилось в глаза его сходство с PureBasic. С большего, это два Си-подобных языка, кроссплатформенные, не имеют классов в явном виде. Единственное, что в PureBasic нету корутин и GC, но в то же время у него богаче стандартная библиотека, есть поддержка UI. Удивительно.
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.
dronnix
Здорово, что появился sync/Map, но вот тонкости когда его использовать, а когда нет — это немного не в духе Go.