Pull to refresh

Релиз Go 1.9

Reading time 2 min
Views 14K
Original author: Francesc Campoy
Сегодня (прим. переводчика: 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 устраивает вечерники, приуроченные к релизу по всему миру.
Tags:
Hubs:
+24
Comments 28
Comments Comments 28

Articles