воскресенье, 21 февраля 2021 г.

Релиз Go 1.16, порты, инструменты

Введение в Go 1.16

Последний выпуск Go, версия 1.16, выходит через шесть месяцев после Go 1.15. Большинство его изменений связано с реализацией цепочки инструментов, среды выполнения и библиотек. Как всегда, релиз поддерживает обещание Go 1 о совместимости. Ожидается, что почти все программы Go будут продолжать компилироваться и работать как раньше.

Изменения в языке

В синтаксисе языка изменений нет.

Порты

Darwin и iOS

Go 1.16 добавляет поддержку 64-битной архитектуры ARM в macOS (также известной как Apple Silicon) с помощью GOOS=darwin, GOARCH=arm64. Как и порт darwin/amd64, порт darwin/arm64 поддерживает режимы cgo, внутреннее и внешнее связывание, c-archive, c-shared и pie build, а также детектор гонки.

Порт iOS, который ранее был darwin/arm64, был переименован в ios/arm64. GOOS=ios подразумевает тег сборки darwin, так же как GOOS=android подразумевает тег сборки linux. Это изменение должно быть прозрачным для всех, кто использует gomobile для создания приложений iOS.

Go 1.16 добавляет порт ios/amd64, предназначенный для симулятора iOS, работающего в macOS на базе AMD64. Ранее это неофициально поддерживалось через darwin/amd64 с набором тегов сборки ios.

Go 1.16 - это последний выпуск, который будет работать в macOS 10.12 Sierra. Go 1.17 потребует macOS 10.13 High Sierra или новее.

NetBSD

Go теперь поддерживает 64-битную архитектуру ARM в NetBSD (порт netbsd/arm64).

OpenBSD

Go теперь поддерживает архитектуру MIPS64 в OpenBSD (порт openbsd/mips64). Этот порт еще не поддерживает cgo.

В 64-битных x86 и 64-битных архитектурах ARM в OpenBSD (порты openbsd/amd64 и openbsd/arm64) системные вызовы теперь выполняются через libc, а не напрямую с помощью инструкции SYSCALL/SVC. Это гарантирует прямую совместимость с будущими версиями OpenBSD. В частности, OpenBSD 6.9 и новее потребует, чтобы системные вызовы выполнялись через libc для нестатических двоичных файлов Go.

386

Как было объявлено в примечаниях к выпуску Go 1.15, Go 1.16 отказывается от поддержки компиляции в режиме x87 (GO386=387). Поддержка процессоров, отличных от SSE2, теперь доступна в режиме soft float (GO386=softfloat). Пользователи, работающие на процессорах, отличных от SSE2, должны заменить GO386=387 на GO386=softfloat.

RISC-V

Порт linux/riscv64 теперь поддерживает cgo и -buildmode=pie. Этот выпуск также включает оптимизацию производительности и улучшения генерации кода для RISC-V.

Инструменты


Команда Go


Модули

Режим с поддержкой модулей включен по умолчанию, независимо от того, присутствует ли файл go.mod в текущем рабочем каталоге или в родительском каталоге. Точнее, переменная среды GO111MODULE теперь по умолчанию равна on (включена). Чтобы переключиться на предыдущее поведение, установите GO111MODULE на auto.

Команды сборки, такие как go build и go test, больше не изменяют go.mod и go.sum по умолчанию. Вместо этого они сообщают об ошибке, если требуется добавить или обновить требование модуля или контрольную сумму (как если бы использовался флаг -mod=readonly). Требования к модулю и суммы могут быть скорректированы с помощью go mod tidy или go get.

go install теперь принимает аргументы с суффиксами версии (например, go install example.com/cmd@v1.0.0). Это приводит к тому, что go install создает и устанавливает пакеты в режиме с поддержкой модулей, игнорируя файл go.mod в текущем каталоге или любом родительском каталоге, если он есть. Это полезно для установки исполняемых файлов, не влияя на зависимости основного модуля.

go install с суффиксом версии или без него (как описано выше) теперь является рекомендуемым способом сборки и установки пакетов в модульном режиме. go get следует использовать с флагом -d для настройки зависимостей текущего модуля без сборки пакетов, а использование go get для сборки и установки пакетов является устаревшим. В будущих выпусках флаг -d всегда будет включен.

Директивы retract теперь могут использоваться в файле go.mod, чтобы указать, что определенные опубликованные версии модуля не должны использоваться другими модулями. Автор модуля может отозвать версию после обнаружения серьезной проблемы или если версия была опубликована непреднамеренно.

Подкоманды go mod vendor и go mod tidy теперь принимают флаг -e, который дает им указание продолжить, несмотря на ошибки в разрешении отсутствующих пакетов.

Команда go теперь игнорирует требования к версиям модуля, исключенным директивами exclude в основном модуле. Раньше команда go использовала следующую версию выше, чем исключенная версия, но эта версия могла со временем изменяться, что приводило к невоспроизводимым сборкам.

В модульном режиме команда go теперь запрещает импорт путей, содержащих символы, отличные от ASCII, или элементы пути с начальным знаком точки (.). Пути к модулям с этими символами уже были запрещены, поэтому это изменение влияет только на пути в подкаталогах модулей.

Встраивание файлов

Команда go теперь поддерживает включение статических файлов и файловых деревьев в окончательный исполняемый файл с помощью новой директивы //go:embed.

go test

При использовании go test тест, который вызывает os.Exit(0) во время выполнения тестовой функции, теперь будет считаться неудачным. Это поможет выявить случаи, когда тест вызывает код, вызывающий os.Exit(0), и тем самым прекращает выполнение всех будущих тестов. Если функция TestMain вызывает os.Exit(0), это все еще считается пройденным тестом.

go test сообщает об ошибке, когда флаги -c или -i используются вместе с неизвестными флагами. Обычно в тесты передаются неизвестные флаги, но при использовании -c или -i тесты не запускаются.

go get

Флаг go get -insecure устарел и будет удален в будущей версии. Этот флаг разрешает выборку из репозиториев и разрешение пользовательских доменов с использованием небезопасных схем, таких как HTTP, а также обходит проверку суммы модулей с использованием базы данных контрольных сумм. Чтобы разрешить использование небезопасных схем, используйте вместо них переменную среды GOINSECURE. Чтобы обойти проверку суммы модуля, используйте GOPRIVATE или GONOSUMDB.

go get example.com/mod@patch теперь требует, чтобы какая-то версия example.com/mod уже требовалась для основного модуля. (Тем не менее, go get -u=patch продолжает исправлять даже недавно добавленные зависимости.)

Переменная среды GOVCS

GOVCS - это новая переменная среды, которая ограничивает инструменты управления версиями, которые команда go может использовать для загрузки исходного кода. Это уменьшает проблемы безопасности с помощью инструментов, которые обычно используются в доверенных средах с проверкой подлинности. По умолчанию git и hg можно использовать для загрузки кода из любого репозитория. svn, bzr и fossil можно использовать только для загрузки кода из репозиториев с путями модулей или путями пакетов, соответствующими шаблонам в переменной среды GOPRIVATE.

all шаблон

Когда файл go.mod основного модуля объявляет версию 1.16 или выше, шаблон пакетов all теперь соответствует только тем пакетам, которые транзитивно импортируются пакетом или тестом, найденным в основном модуле. (Пакеты, импортированные тестами пакетов, импортированных основным модулем, больше не включаются.) Это тот же набор пакетов, который оставался после go mod vendor, начиная с версии Go 1.11.

Флаг сборки -toolexec

Когда флаг сборки -toolexec указан для использования программы при вызове программ инструментальной цепочки, таких как compile или asm, переменная среды TOOLEXEC_IMPORTPATH теперь устанавливается на путь импорта собираемого пакета.

Флаг сборки -i

Флаг -i, принимаемый командами go build, go install и go test, устарел. Флаг -i указывает команде go установить пакеты, импортированные пакетами, указанными в командной строке. Поскольку кеш сборки был введен в Go 1.10, флаг -i больше не оказывает существенного влияния на время сборки и вызывает ошибки, когда каталог установки недоступен для записи.

Команда list

Когда указан флаг -export, в поле BuildID теперь устанавливается идентификатор сборки скомпилированного пакета. Это эквивалентно запуску инструмента go tool buildid в go list -exported -f {{.Export}}, но без дополнительного шага.

Флаг -overlay

Флаг -overlay указывает файл конфигурации JSON, содержащий набор замен пути к файлу. Флаг -overlay может использоваться со всеми командами сборки и подкомандами go mod. Он в первую очередь предназначен для использования инструментами редактора, такими как gopls, для понимания последствий несохраненных изменений в исходных файлах. Файл конфигурации сопоставляет фактические пути к файлам замены, и команда go, и ее сборки будут выполняться так, как если бы фактические пути к файлам существовали с содержимым, указанным в путях к файлам замены, или не существовали, если пути к файлам замены пусты.

Cgo

Инструмент cgo больше не будет пытаться переводить битовые поля структуры C в поля структуры Go, даже если их размер может быть представлен в Go. Порядок, в котором битовые поля C появляются в памяти, зависит от реализации, поэтому в некоторых случаях инструмент cgo выдавал результаты, которые были заведомо неверными.

Vet

Новое предупреждение о недопустимом тестировании. Использование в горутинах

Инструмент vet теперь предупреждает о недопустимых вызовах метода testing.T Fatal из горутины, созданной во время теста. Это также предупреждает о вызовах методов Fatalf, FailNow и Skip{,f,Now} для тестов testing.T или тестов testing.B.

Вызов этих методов останавливает выполнение созданной горутины, а не функции Test* или Benchmark*. Таким образом, они должны вызываться горутиной, выполняющей функцию тестирования или бенчмарка. Например:

func TestFoo(t *testing.T) {
    go func() {
        if condition() {
            t.Fatal("oops") // Выход из внутренней функции 
                            // вместо TestFoo.
        }
        ...
    }()
}

Код, вызывающий t.Fatal (или аналогичный метод) из созданной горутины, должен быть переписан, чтобы сигнализировать об ошибке теста с помощью t.Error и досрочно выйти из горутины с помощью альтернативного метода, например, с помощью оператора return. Предыдущий пример можно было бы переписать как:

func TestFoo(t *testing.T) {
    go func() {
        if condition() {
            t.Error("oops")
            return
        }
        ...
    }()
}

Новое предупреждение для frame указателя

Инструмент vet теперь предупреждает о сборке amd64, которая затирает регистр BP (frame указатель), не сохраняя и не восстанавливая его, вопреки соглашению о вызовах. Код, который не сохраняет регистр BP, должен быть изменен, чтобы либо не использовать BP вообще, либо сохранить BP путем его сохранения и восстановления. Простой способ сохранить BP - это установить для размера frame ненулевое значение, в результате чего сгенерированные пролог и эпилог сохранят регистр BP для вас.

Новое предупреждение для asn1.Unmarshal

Инструмент vet теперь предупреждает о неправильной передаче аргумента, не являющегося указателем, или аргумента nil в asn1.Unmarshal. Это похоже на существующие проверки для encoding/json.Unmarshal и encoding/xml.Unmarshal.


Читайте также:


Комментариев нет:

Отправить комментарий