КОДЕКС
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/os
package.- Представлены новый интерфейс, связанный с абстрактным файлом только для чтения,
io/fs
package и его тестовый пакетtesting/fstest
. - Он поддерживает встраивание пакета, встраивание файлов с помощью команды
//go:embed
в процессе компиляции и последующего доступа. Таким образом, объединение файла данных и кода Go в двоичный файл становится более простым, а развертывание - более эффективным. - Вы должны использовать
Error
method, чтобы выдать ошибку в горутине метода тестирования, в то время какFatcal
method исключен. - В
crypto
package внесены небольшие изменения. - Пакет
Encoding
также имеет изменения, касающиесяjson
,xml
иasn1
. Flag
добавляет функцию newFunc
для облегчения чтения.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
ReadAll = › io.ReadAll
ReadDir = › os.ReadDir
ReadFile = › os.ReadFile
TempDir = › os.MkdirTemp
Заменить функцию 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