Как всегда, релиз следует обещанию совместимости с Go 1.x. А значит что все существующие программы так же будут собираться Golang 1.17.
Изменения в языке
Указатель на массив
- Преобразование из слайса
[]T
в указатель на массив*[N]T
, конструкцией видаgo var array = (*[50]byte)(slice)
Вызывает run-time panic при выходе за границы. Подробно.
unsafe
- unsafe.Add(ptr, len) = unsafe.Pointer(uintptr(ptr) + uintptr(len))
- unsafe.Slice, превращает указатель *T в слайс, unsafe.Slice(ptr, len) -> []T
Инструменты
Различные изменения в инструментах, включая
- Сокращённый граф модулей для go 1.17 модулей.
- Ленивая загрузка модулей
- Отдельные блоки require в go.mod для косвенных зависимостей.
- Добавлена поддержка комментария
// Deprecated:
в go.mod. - Удалена поддержка флага -insecure в
go get -insecure
- Если в go.mod отсутствует директива go, то версия принимается за go 1.11, а не за текущую. А для зависимостей с тем же изъяном за go 1.16 (о-оу).
- Для модулей go1.17 команда
go mod vendor
теперь создаёт файлvendor/modules.txt
и не включаетgo.mod
иgo.sum
зависимостей. - Подавление запроса пароля при загрузке по SSH. Можно настроить.
- Для обновления go.sum теперь стоит вызывать
go mod download all
как то было в go1.15. - Добавлен магический комментарий
//go:build lines
вместо// +build lines
что бы [это ни значило]https://golang.org/design/draft-gobuild). go run
теперь позволяет запускать конеретную версию пакета, по типуgo run example.com/cmd@v1.0.0
go vet
бросает новые предупреждения для//go:build
and// +build lines
- при подписке
signal.Notify
на канал без буфера - когда методы Is, As и Unwrap отличны от описанных в errors, но используются пакетом errors
- cover теперь быстрее работает, но заметно только на огромных проектах
Компилятор
- Аргументы передаются через регистры, а не стек. Что даёт ускорение около 5%, и снижение размера файла около 2%. Это только для 64-битных Linux, MacOS и Windows (linux/amd64, darwin/amd64, windows/amd64). Это изменения не касается безопасного кода, в основном относится к его unsafe части.
- Так же улчшен формат runtime.Stack.
- Функции содержащие замыкания теперь тоже могут быть встроены (inlined).
Компоновщик (linker)
- Если используется внешний компоновщик, то опция
-I
передаётя ему.
Основные библиотеки
Cgo
- Пакет
runtime/cgo
добавляет поддержку для передачи значений между Go и C. Посмотрите на runtime/cgo.Handle.
Разбор URL-query
- Ранее, пакеты
net/url
andnet/http
принимали;
(точку с запятой) как разделитель наряду с&
. Теперь это не так. И даже ошибка летит в лог, если встретится точка с запятой. Значения с ней игнорируются. Изменить поведение обратно дляnet/http
можно с помощью [AllowQuerySemicolons]https://pkg.go.dev/net/http@master#AllowQuerySemicolons), но это сделано для безопсности.
И так далее включая небольшие изменения в библиотеках. Из которых, может стоит, отметить методы
- time.Time.IsDST – летнее время
- time.Time.UnixMilli и аналогичный ему UnixMicro для тех, кто не умеет делить сам
- net.IP.IsPrivate
- Методы Swap и CompareAndSwap для atomic.Value.
- Для тестов добавлен флаг
-shuffle
для запуска тестов в хаотичном порядке. - Так же в тестах теперь есть методы T.Setenv (и для B тоже). Которые выставляют переменную на время теста или бенчмарка.
Текст новости исправлен и переработан Shaman007 и другими корректорами
>>> Подробности