Выпуск Go, версия 1.15, выходит через шесть месяцев после Go 1.14. Большинство его изменений связано с реализацией цепочки инструментов, среды выполнения и библиотек. Как всегда, релиз поддерживает обещание Go 1 совместимости. Ожидается, что почти все программы Go будут продолжать компилироваться и работать как раньше.
Go 1.15 включает в себя существенные улучшения компоновщика, улучшает распределение для небольших объектов при большом количестве ядер и не поддерживает X.509 CommonName. GOPROXY теперь поддерживает пропуск прокси, возвращающих ошибки, и был добавлен новый встроенный пакет tzdata.
Изменений в языке нет.
Порты
Darwin
Как было объявлено в примечаниях к выпуску Go 1.14, для Go 1.15 требуется macOS 10.12 Sierra или новее; поддержка предыдущих версий прекращена.
Как было объявлено в примечаниях к выпуску Go 1.14, Go 1.15 отказывается от поддержки 32-битных двоичных файлов в macOS, iOS, iPadOS, watchOS и tvOS (порты darwin/386 и darwin/arm). Go продолжает поддерживать 64-битные порты darwin/amd64 и darwin/arm64.
Windows
Go теперь генерирует исполняемые файлы Windows ASLR, если указан флаг -buildmode=pie cmd/link. Команда Go по умолчанию использует -buildmode=pie в Windows.
Флаги -race и -msan теперь всегда включают -d=checkptr, который проверяет использование unsafe.Pointer. Раньше так было во всех ОС, кроме Windows.
Собранные на Go библиотеки DLL больше не вызывают завершение процесса при получении сигнала (например, Ctrl-C на терминале).
Android
При компоновке двоичных файлов для Android Go 1.15 явно выбирает компоновщик lld, доступный в последних версиях NDK. Компоновщик lld позволяет избежать сбоев на некоторых устройствах, и планируется, что он станет компоновщиком NDK по умолчанию в будущей версии NDK.
OpenBSD
Go 1.15 добавляет поддержку OpenBSD 6.7 на GOARCH=arm и GOARCH=arm64. Предыдущие версии Go уже поддерживали OpenBSD 6.7 на GOARCH=386 и GOARCH=amd64.
RISC-V
Достигнут прогресс в улучшении стабильности и производительности 64-разрядного порта RISC-V в Linux (GOOS=linux, GOARCH=riscv64). Он также теперь поддерживает асинхронное прерывание.
386
Go 1.15 - последний выпуск, который поддерживает оборудование с плавающей запятой только для x87 (GO386=387). В будущих выпусках потребуется как минимум поддержка SSE2 на 386, что повысит минимальное требование Go для GOARCH=386 до Intel Pentium 4 (выпущенного в 2000 году) или AMD Opteron/Athlon 64 (выпущенного в 2003 году).
Инструменты
Команда Go
Переменная среды GOPROXY теперь поддерживает пропуск прокси, возвращающих ошибки. URL-адреса прокси теперь можно разделять запятыми (,) или вертикальной чертой (|). Если за URL-адресом прокси-сервера стоит запятая, команда go будет пробовать только следующий прокси в списке после HTTP-ответа 404 или 410. Если после URL-адреса прокси-сервера следует вертикальная черта, команда go попробует следующий прокси в списке после любой ошибки. Обратите внимание, что значение GOPROXY по умолчанию остается https://proxy.golang.org,direct, которое не возвращается к direct в случае ошибок.
go test
Изменение флага -timeout теперь делает недействительными кешированные результаты теста. Кешированный результат для тестового запуска с длинным тайм-аутом больше не будет считаться пройденным, если go test повторно запускается с коротким.
Разбор флагов
Исправлены различные проблемы с синтаксическим анализом флагов в go test и go vet. Примечательно, что флаги, указанные в GOFLAGS, обрабатываются более последовательно, а флаг -outputdir теперь интерпретирует относительные пути относительно рабочего каталога команды go (а не рабочего каталога каждого отдельного теста).
Кеш модуля
Местоположение кэша модуля теперь можно задать с помощью переменной среды GOMODCACHE. Значение GOMODCACHE по умолчанию - GOPATH[0]/pkg/mod, расположение кэша модуля до этого изменения.
Теперь доступен обходной путь для ошибок Windows "Access is denied" в командах go, которые обращаются к кэшу модуля, вызванных одновременным сканированием файловой системы внешними программами. Обходной путь не включен по умолчанию, потому что его небезопасно использовать, когда версии Go ниже 1.14.2 и 1.13.10 работают одновременно с одним и тем же кешем модуля. Его можно включить, явно установив переменную среды GODEBUG=modcacheunzipinplace=1.
Vet
Новое предупреждение для string(x)
Инструмент vet теперь предупреждает о преобразованиях формы string(x), где x имеет целочисленный тип, отличный от rune или byte. Опыт работы с Go показал, что многие преобразования этой формы ошибочно предполагают, что string(x) оценивается как строковое представление целого числа x. Фактически он вычисляет строку, содержащую кодировку UTF-8 значения x. Например, string(9786) не оценивается как строка "9786"; а оценивается как строка "\xe2\x98\xba" или "☺️".
Код, который правильно использует string(x), можно переписать в string(rune(x)). Или, в некоторых случаях, правильным решением может быть вызов utf8.EncodeRune(buf, x) с подходящим байтовым срезом buf. Другой код, скорее всего, должен использовать strconv.Itoa или fmt.Sprint.
Эта новая vet проверка включена по умолчанию при использовании go test.
Рассматривается возможность запрета преобразования в будущем выпуске Go. То есть язык изменится, чтобы разрешить string(x) только для целого числа x, если тип x - rune или byte. Такое изменение языка не будет обратно совместимым. Эта vet проверка используется в качестве первого пробного шага к изменению языка.
Новое предупреждение о невозможности преобразования интерфейса
Инструмент vet теперь предупреждает об утверждениях типа от одного типа интерфейса к другому типу интерфейса, когда утверждение типа всегда терпит неудачу. Это произойдет, если оба типа интерфейса реализуют метод с тем же именем, но с другой сигнатурой типа.
Нет причин писать утверждение типа, которое всегда терпит неудачу, поэтому любой код, запускающий эту vet проверку, следует переписать.
Эта новая vet проверка включена по умолчанию при использовании go test.
Рассматривается возможность запрета утверждений о невозможных типах интерфейсов в будущих версиях Go. Такое изменение языка не будет обратно совместимым. Эта vet проверка используется в качестве первого пробного шага к изменению языка.
Читайте также:
- Релиз Go 1.14: изменения в языке и его портах
- Релиз Go 1.14: инструменты, команда go
- Go 1.13 заметки о релизе
Комментариев нет:
Отправить комментарий