КОДЕКС

Go 1.16 запущен

На прошлой неделе был выпущен Go1.16, внесший относительно больше изменений, чем версия 1.15, на которую повлияла эпидемия.

Обновление касается многих аспектов, включая компиляцию, развертывание, стандартную библиотеку и т. Д. В официальном документе Go все изменения классифицируются на основе Tools, Runtime, Complier и т. Д.

Несомненно, хорошо копаться во всех изменениях, но иногда мы понимаем их в этот момент и забываем их в следующую секунду, не говоря уже о том, чтобы по-настоящему ухватить их все. Для облегчения запоминания я делю изменения, которые, как мне кажется, важны для рядовых разработчиков, на две категории.

  • Underlining Change, включая все изменения, не связанные с кодом.
  • Standard library updates, который тесно связан с кодированием.

Затем давайте посмотрим на некоторые изменения и обнаружим их влияние на конкретных примерах.

Подчеркивание

  • Лучшая поддержка macOS arm64

Тесное сотрудничество с архитектурой arm64 чипа Apple M1 позволяет лучше подготовиться к разработке на базе Mac. Кроме того, поддерживаются как cgo, так и функции компиляции динамических / статических библиотек компоновки. Для получения дополнительной информации, пожалуйста, обратитесь к этому официальному блогу.

  • Включение модуля Go по умолчанию

Нам больше не требуется объявлять GO111MODULE, если эта переменная среды включена по умолчанию. Сейчас 2021 год, а кто еще не использовал модули Go?

  • Перейти установить команду

Команда go install позволяет устанавливать программы go, не влияя на зависимости файлов мода. Например, достаточно выполнить go install module1/[email protected] плюс номер версии.

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

  • Нет импорта относительного пути

Импорт не может начинаться с ., а символы, отличные от ASCII, не допускаются.

  • Повышение точности Race Debugger

Когда вы включите race detect, вы можете увидеть больше отчетов о гонках.

  • Переключение политики управления памятью по умолчанию с MADV_FREE обратно на MADV_MONTNEED

Это комплексный низкоуровневый выбор, учитывающий изменения в версии ядра Linux и реакцию различных инструментов, соответствующих Go. Судя по практике с версии 1.12 до 1.15, переход на MADV_FREE , похоже, принес больше вреда, чем пользы. Поэтому команда Go изменила конфигурацию обратно на MADV_MONTNEED, которая использовалась до Golang 1.12, чтобы удовлетворить требованиям сообщества. Для более подробного обсуждения, пожалуйста, обратитесь к # 42330.

Обновления стандартной библиотеки

Версия 1.16 внесла множество изменений в стандартную библиотеку.

  • io/ioutil package устарел, а связанные с ним API перенесены в io/ospackage.
  • Представлены новый интерфейс, связанный с абстрактным файлом только для чтения, io/fs package и его тестовый пакет testing/fstest.
  • Он поддерживает встраивание пакета, встраивание файлов с помощью команды //go:embed в процессе компиляции и последующего доступа. Таким образом, объединение файла данных и кода Go в двоичный файл становится более простым, а развертывание - более эффективным.
  • Вы должны использовать Error method, чтобы выдать ошибку в горутине метода тестирования, в то время как Fatcalmethod исключен.
  • В crypto package внесены небольшие изменения.
  • Пакет Encoding также имеет изменения, касающиеся json, xml и asn1.
  • Flag добавляет функцию new Func для облегчения чтения.
  • log.Default - это новый метод, который предоставляет уровень пакета по умолчанию Logger.
  • Функция StripPrefix в пакете net/http поддерживает чередование Path и RawPath.
  • Есть улучшения производительности. Например, новая функция WalkDir в пакете path/filepath работает быстрее по сравнению с функцией Walk, а strconv.ParseFloat ускоряется с коэффициентом 2 (хотя я редко использую ее).
  • Созданы новые смайлы! Поддерживая Unicode 13.0.0, мы можем получать эмодзи типа _43 _, _ 44_, от U+30000 до U+3FFFF.

Случаи применения

Теперь мы углубим наше понимание этих новых изменений с помощью некоторых практик.

Первым делом необходимо установить Go1.16.

$ go get golang.org/dl/go1.16
$ go1.16 download
Unpacking /Users/xxx/sdk/go1.16/go1.16.darwin-amd64.tar.gz ...
Success. You may now run 'go1.16'

SDK будет помещен в каталог /Users/xxx/sdk/go1.16.

Давай попробуем!

Go Embed

У Golang был недостаток, заключающийся в том, что двоичный исполняемый файл не будет работать, если он был перемещен в другие каталоги, вследствие неспособности исполняемого двоичного файла найти используемый файл конфигурации.

Иногда мы не чувствуем этой проблемы благодаря изображениям докеров, которые включают все файлы конфигурации и исполняемый двоичный файл. И теперь Go разработал собственное решение, embed package, упаковывая файлы вместе в двоичные файлы.

Используйте //go:embed в коде для включения статических файлов. Ниже приведен простой пример.

И embed поддерживает такие типы, как string, byte, slice, fs и т. Д. Код приведен ниже.

Чтобы заметили, вы можете встроить весь каталог, объявив //go:embed resources.

На мой взгляд, функция embed имеет три преимущества.

  • Он поддерживает различную встроенную грамматику и удобен в использовании.
  • Это безопасно, потому что все встраивания происходят во время компиляции.
  • Это улучшает переносимость Go, так как двоичные файлы могут запускаться повсюду, как файлы Java jar.

Новый пакет io / fs

Это увлекательная особенность!

io/fs, определяющий интерфейс для файловых деревьев, доступных только для чтения
- из io/fs проекта

Пакет io/fs предлагает абстракцию различных типов файловых систем, предоставляя более общий интерфейс. Интерфейс FS прост, и мы можем найти другие функции в его реализации, но Open - единственное, что здесь нужно.

Для чтения файлов Open недостаточно. Следовательно, вы также можете найти интерфейсыFile и ReadDir в пакете io/fs, который дает вам путь к чтению файлов и каталогов соответственно.

Изучая код embed.FS, я могу лучше понять логику, связанную с io/fs. Для доступа к содержимому файла embed реализует интерфейс fs.FS, интерфейс fs.File, интерфейс fs.ReadDirFile и т. Д.

Вот несколько соответствующих кодов.

Другие реализации fs.FS находятся в таких пакетах, как http/template, text/template, net/http, archive/zip, archive/tar и т. Д., Что облегчает обработку файлов zip и tar и значительно упрощает код при обработке файлов http.

Устаревший пакет io / ioutil

Существование пакета io/ioutil может сбить с толку разработчиков, потому что это не чистая util коллекция. И экспорт типов / функций туда, где они принадлежат, звучит разумно. Предложения: №40025 и №42026.

Всего затронуто восемь типов / функций, цитируется здесь.

Discard = › io.Discard

NopCloser = › io.NopCloser

ReadAll = › io.ReadAll

ReadDir = › os.ReadDir

ReadFile = › os.ReadFile

TempDir = › os.MkdirTemp

TempFile = › os.CreateTemp

WriteFile = › os.WriteFile

Заменить функцию Walk на WalkDir

Я создал простой тест производительности, чтобы доказать улучшение производительности.

Код очень прост: создается многоуровневый каталог, а затем выполняется обход. Единственная разница в том, какую функцию вы выберете: WalkDir или Walk. Затем бегите смотреть результат.

Интуитивно WalkDir, конечно, почти в два раза быстрее, только в сценариях с более чем четырьмя уровнями вложенных каталогов (мой локальный тестовый env). Если есть только однослойный каталог, две функции не имеют значения.

Я не собираюсь демонстрировать одно за другим некоторые другие тривиальные изменения, такие как пакет cryto, который я редко использовал.

В конце

Go 1.16 только что был выпущен, и если возникнут какие-либо проблемы, будут ли разработчики сопротивляться, примут ли его или предпочтут, пусть время покажет. Для меня только функция go embed стоит моего обновления и попытки. Будем следить за обновлениями сообщества. Дженерики уже в пути.

Спасибо за прочтение!

Ссылка

Https://blog.golang.org/go1.16

Https://eddycjy.com/posts/go/go1.16-2/

Https://docs.studygolang.com/blog/ports

Https://blog.golang.org/go116-module-changes

Https://go.googlesource.com/proposal/+/master/design/draft-iofs.md

Https://docs.google.com/document/d/1D13QhciikbdLtaI67U6Ble5d_1nsI4befEd6_k1z91U/view