Slide 1

Slide 1 text

Илья Данилкин Senior Engineer / Scrum Master Москва — 2021 ПАКЕТ EMBED: РАСПАКОВКА ЗНАНИЙ

Slide 2

Slide 2 text

2 Илья Данилкин Senior Engineer / Scrum Master Пишу на Go, начиная с версии 1.6. Работаю в Авито в юните Auto. Наша команда делает сервисы для профессиональных пользователей в категории Авто. ► Спикер GopherCon Russia 2018-2021 ► OpenGApps contributor nezorfla.me/golang-talks

Slide 3

Slide 3 text

AGENDA 3 ► Что такое “embedding”? ► Варианты решений для Go ► Go 1.16 и “embed” ► Live demo ► Итоги

Slide 4

Slide 4 text

ЧТО ТАКОЕ EMBEDDING? ПАКЕТ EMBED: РАСПАКОВКА ЗНАНИЙ 4

Slide 5

Slide 5 text

EMBEDDING Встраивание файлов в исполняемый файл (обычно на этапе компиляции) ► Дистрибуция одним файлом ► Использование ресурсов напрямую (иконка приложения) ► HTTP-сервер: статика для сайта 5

Slide 6

Slide 6 text

► C / C++: xxd, ld, bin2cpp ► Rust: include_bytes, rust-embed, etc. 6 USAGE $ cat test.txt some text for testing $ xxd /-include test.txt unsigned char test_txt[] = { 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67 }; unsigned int test_txt_len = 21;

Slide 7

Slide 7 text

ВАРИАНТЫ РЕШЕНИЙ ДЛЯ GO ПАКЕТ EMBED: РАСПАКОВКА ЗНАНИЙ 7

Slide 8

Slide 8 text

► Кодогенерация (бинарник / go generate) ► Использование через Asset() ► Сжатие 8 GO-BINDATA //go:generate go-bindata -pkg $GOPACKAGE -o assets.go assets/ data, err /= Asset("assets/style/foo.css") if err /= nil { // Asset was not found. } // use asset data > go-bindata -o myfile.go data/ ☠ RIP [2011 - 2018]

Slide 9

Slide 9 text

АЛЬТЕРНАТИВЫ ► shurcooL/vfsgen ► rakyll/statik ► gobuffalo/packr ► GeertJohan/go.rice 9

Slide 10

Slide 10 text

КЛЮЧЕВЫЕ ФИЧИ 10 Ease of use 01.

Slide 11

Slide 11 text

КЛЮЧЕВЫЕ ФИЧИ 11 Ease of use 01. Архивация 02.

Slide 12

Slide 12 text

КЛЮЧЕВЫЕ ФИЧИ 12 Ease of use 01. Архивация 02. http.FileSystem 03.

Slide 13

Slide 13 text

КЛЮЧЕВЫЕ ФИЧИ 13 Easy to use 01. Архивация 02. http.FileSystem 03. Local FS 04.

Slide 14

Slide 14 text

СРАВНЕНИЕ 14 Library Easy to use Compression http.FileSystem Local FS go-bindata YES YES NO* YES vfsgen YES YES+ YES YES packr YES YES YES YES statik YES YES YES NO embed YES NO YES NO

Slide 15

Slide 15 text

GO 1.16 И “EMBED” ПАКЕТ EMBED: РАСПАКОВКА ЗНАНИЙ 15

Slide 16

Slide 16 text

DRAFT Design: https://golang.org/s/draft-embe d-design ► By Russ Cox, Brad Fitzpatrick ► Reddit, video ► Прототип 16

Slide 17

Slide 17 text

PROPOSAL ► Новый пакет embed ► import _ "embed" ► Упаковка: initEmbed() -> cmd/compile/internal/gc/e mbed.go GitHub 17

Slide 18

Slide 18 text

FILE 18 ► string, []byte ► //go:embed foo static/ abc/* ► Не забываем пустой импорт!

Slide 19

Slide 19 text

EMBED FS 19 ► embed.FS ► read-only ► Без * учитывает файлы с . и _ Proposal для go:embed all

Slide 20

Slide 20 text

HTTP STATIC 20 ► http.FileSystem ► http/template ► Не путать с text/tempalte!

Slide 21

Slide 21 text

COMMUNITY 21 ► embed-encrypt - AES-шифрование More coming soon? 😉

Slide 22

Slide 22 text

LIVE DEMO ПАКЕТ EMBED: РАСПАКОВКА ЗНАНИЙ 22

Slide 23

Slide 23 text

23 LIVE DEMO пакет embed: распаковка знаний

Slide 24

Slide 24 text

ИТОГИ ПАКЕТ EMBED: РАСПАКОВКА ЗНАНИЙ 24

Slide 25

Slide 25 text

ИТОГИ 25 Простое barebones - решение 01.

Slide 26

Slide 26 text

ИТОГИ 26 Простое barebones - решение 01. Альтернативы для большего кол-ва фич 02.

Slide 27

Slide 27 text

ИТОГИ 27 Простое barebones - решение 01. Альтернативы для большего кол-ва фич 02. Power of community! 03.

Slide 28

Slide 28 text

Москва — 2021 Илья Данилкин Senior Engineer / Scrum Master avito-tech nezorflame nezorflame Draft & proposal Ссылки: Artwork: ashleymcnamara/gophers awesome-go: resource embedding pkg.go.dev/embed