Съдържание и теми, включени в курса
1. Въведение в Go
- Какво е Go (Golang)?
- История и дизайнерска философия на Go
- Go като език за уеб и системно програмиране
- Ключови характеристики:
- Статично типизиране
- Простота и четимост
- Бързо компилиране
- Вградена конкурентност
- Събиране на боклук (Garbage Collection)
- Кросплатформено компилиране
- Общи употреби на Go
- Предимства и ограничения на Go
- Сравнение на Go с C/C++, JavaScript, Ruby, Python и Java
- Разбиране на екосистемата на Go
- Преглед на стандартната библиотека на Go
- Модули на Go и управление на зависимостите
- Анатомия на приложение на Go
- Практика: Разглеждане и изпълнение на прост програма на Go
2. Настройване на средата за разработка на Go
- Инсталиране на Go
- Разбиране на инструменталния набор (toolchain) на Go
- Конфигуриране на променливи на средата
- Избор на IDE или редактор на код
- Използване на командния ред с Go
- Създаване на работно пространство (workspace) на Go
- Разбиране на структурата на проекта Go
- Инициализиране на проект с Go Modules
- Използване на
go mod init - Управление на зависимостите с
go get - Обновяване и инспекция на зависимостите
- Форматиране на изходния код с
gofmt - Изпълнение на програми с
go run - Компилиране на приложения с
go build - Инсталиране на приложения на Go
- Крос-компилиране на приложения
- Практика: Създаване и конфигуриране на проект Go в контейнер
3. Променливи, константи и типове в Go
- Деклариране на променливи
- Експлицитни срещу инферирани типове
- Кратко деклариране на променливи
- Константи
- Нулеви стойности
- Обхват и жизнен цикъл на променливите
- Примитивни данни типове:
- Цели числа
- Числа с плъваща запетая
- Комплексни числа
- Булеви стойности
- Стрингове
- Конвертиране на типове
- Работа с Unicode и UTF-8
- Runes и байтове
- Мултиплес присвояване на променливи
- Разбиране на безопасността на типовете
- Упражнение: Изграждане на малка конзолна програма за обработка на данни
4. Оператори и изрази
- Аритметични оператори
- Оператори за сравнение
- Логически оператори
- Оператори за присвояване
- Инкремент и декремент
- Приоритет на операторите
- Работа с аритметика за цели числа и числа с плъваща запетая
- Избягване на чести грешки при конвертиране на типове
- Упражнение: Имплементация на изчисления и логика за валидация
5. Дати, времена и форматиране
- Използване на пакета
time - Създаване и манипулиране на дати
- Получаване на текущото време
- Часови зони и локации
- Разбиране (Parsing) на дати и времена
- Форматиране на дати и времена
- Изчисляване на продължителности
- Работа с Unix timestamps
- Обработка на таймауты
- Упражнение: Добавяне на временни марки и изчисления на продължителност към приложение
6. Масиви, Slice-и, Maps и Structs
Масиви
- Деклариране на масиви
- Инициализиране на масиви
- Итерация върху масиви
- Мултидименсионални масиви
Slice-и
- Разбиране на slice-ите спрямо масивите
- Създаване на slice-и
- Добавяне на елементи
- Копиране на slice-и
- Дължина и капацитет на slice-и
- Слагане (Slicing) на slice-и
- Чести капани при работа с slice-и
Maps
- Създаване на maps
- Добавяне и премахване на записи
- Проверка дали ключ съществува
- Итерация върху maps
- Maps, съдържащи сложни данни
Structs
-
Дефиниране на структури
-
Поля на structs
-
Инициализиране на structs
-
Вложени structs
-
Анонимни structs
-
Методи на structs
-
JSON тагове за structs
-
Практика: Моделуване на потребители, продукти и данни на приложение с помощта на structs, slice-и и maps
7. Условна логика и цикли
- Изрази
if elseиelse if- Деклариране на променливи в условия
- Цикли
for - Безкрайни цикли
- Условия на цикъла
breakиcontinue- Итерация с
range - Вложени цикли
- Изрази
switch - Switch-ове, базирани на изрази
- Множествени случаи
- По подразбиране (Default) случаи
- Type switches
- Упражнение: Имплементация на логика за валидация и обработка на приложението
8. Функции
- Дефиниране на функции
- Параметри на функции
- Връщани стойности
- Няколко връщани стойности
- Именовани връщани стойности
- Variadic функции
- Анонимни функции
- Стойности на функции
- Затваряния (Closures)
- Рекурсия
- Предаване на функции като аргументи
- Функции, връщащи грешки
- Дизайн на малки, повторно използваеми функции
- Упражнение: Рефакториге на съществуващ код в повторно използваеми функции
9. Показатели и концепции за памет
- Какво е показател? (Pointer)
- Оператори за адрес и демаркиране (dereference)
- Показатели и параметри на функции
- Показатели за приемане (Pointer receivers)
- Показатели към structs
- Nil показатели
- Кога да се използват показатели
- Семантика на стойност срещу семантика на референтно тавно
- Разбиране на управлението на паметта и събирането на боклука в Go
- Чести грешки с показатели
- Практика: Промяна на данни на приложението с помощта на показатели
10. Създаване на уеб приложение в Go
- Преглед на уеб възможностите на Go
- Въведение в пакета
net/http - Създаване на HTTP сървър
- HTTP заявки и отговори
- HTTP методи
- URL-и на заявки и параметри от запита
- HTTP заглавки
- HTTP статусни кодове
- Основи на маршрутизацията
- Създаване на обработвачи (handlers)
- Обработка на данни от формуляри
- Сервиране на статични файлове
- Работа с HTML шаблони
- Променливи на шаблоните и контролни структури
- Структуриране на уеб приложение
- Практика: Изграждане на основен уеб сървър на Go
11. Изграждане на RESTful уеб услуга
- Основи на REST архитектурата
- Дизайн на API ендпоинти
- GET, POST, PUT, PATCH и DELETE
- Работа с JSON
- Кодиране и декодиране на JSON
- Валидация на заявки
- HTTP статусни кодове
- Отговори при грешки
- Параметри от запита и параметри от пътя
- Структури на API отговори
- Разделяне на обработвачи и бизнес логика
- Практика: Изграждане на CRUD REST API
12. Go Runtime, компилация и изграждане на проекти
- Разбиране на Go компилатора
- Процес на изграждане в Go
go rungo buildgo installgo test- Флагове за изграждане
- Конфигурация, специфична за средата
- Изграждане за различни операционни системи и архитектури
- Произвеждане на самостоятелни бинарни файлове
- Управление на конфигурацията на приложението
- Упражнение: Компилиране на приложението за множество платформи
13. Работа с файлове и уеба
- Отваряне и затваряне на файлове
- Четене на файлове
- Запис на файлове
- Създаване на директории
- Метаданни на файлове
- Буфериран I/O
- Работа с потоци
- Четене и запис на JSON файлове
- HTTP клиенти
- Изпращане на изходящи HTTP заявки
- Обработка на грешки на HTTP клиентите
- Таймауты и отмяна
- Обработка на API отговори
- Практика: Извличане на данни от външен API и съхраняването им локално
14. Обработка на грешки и дебъгване
- Подходът на Go към грешките
- Връщане на грешки от функции
- Проверка на грешки
- Създаване на потребителски грешки
- Обвиване (Wrapping) на грешки
- Добавяне на контекст към грешки
errors.Isиerrors.As- Panic и recovery
- Кога да се използва
panic - Дебъгване на чести проблеми в Go
- Логироване на активността на приложението
- Използване на инструменти за дебъгване на Go
- Упражнение: Диагностициране и поправка на умишлено въведени грешки в приложението
15. Интерфейси и абстракция
- Какво е интерфейс?
- Имплицитна имплементация на интерфейси
- Дефиниране на интерфейси
- Стойности на интерфейси
- Празни интерфейси /u00a0
any - Твърдения за типове (Type assertions)
- Type switches
- Имplementации чрез показател срещу стойност
- Дизайн на малки интерфейси
- Обръщане на зависимостите
- Използване на интерфейси за тестване
- Намаляване на свързаността на приложението
- Практика: Въвеждане на интерфейси в примерното уеб приложение
16. Пакети и организация на проекта
- Създаване на пакети
- Конвенции за именуване на пакети
- Експортирани и неекспортирани идентификатори
- Импорт на пакети
- Инициализация на пакети
- Организиране на нивата на приложението
- Вътрешни пакети (Internal packages)
- Управление на зависимостите с Go Modules
- Семантично версиониране
- Използване на пакети на трети страни
- Избягване на циклични зависимости
- Дизайн на поддържаеми проекти на Go
- Упражнение: Рефакториге на приложението в отделни пакети
17. Конкурентност с Goroutines
- Какво е конкурентност?
- Goroutines
- Пускане на goroutines
- Разбиране на лековесното конкурентно изпълнение
- Предизвикателства при синхронизация
- Споделено състояние
- Състезателни условия (Race conditions)
- Използване на
sync.WaitGroup - Мютексове и мютексове за четене/писане
- Атомарни операции
- Практика: Преобразуване на последователна задача в конкурентна обработка
18. Канали (Channels)
- Разбиране на каналите
- Изпращане и получаване на стойности
- Буфериращи срещу небуфериращи канали
- Блокиращо поведение
- Затваряне на канали
- Итерация върху канали
- Канали с посока
- Комunikация чрез канали
- Изрази Select
- Таймауты и отмяна
- Монстри на работници (Worker-pool patterns)
- Производител/потребител (Producer/consumer patterns)
- Практика: Изграждане на конкурентна система на работници
19. Контекст и управление на заявки
- Защо контекстите са важни в уеб приложения
context.Context- Контекст с обхват на заявка
- Отмяна
- Краен срок (Deadlines)
- Таймауты
- Разпространение на контекста през нивата на приложението
- Отмяна на бази данни или HTTP операции
- Избягване на неправилно използване на контекста
- Упражнение: Добавяне на отмяна на заявки и таймауты към уеб приложението
20. Тестване на Go приложения
- Защо автоматизираното тестване е важно
- Писане на unit тестове
- Пакетът
testing - Тестови функции
- Конвенции за именуване на тестове
- Тестове, базирани на таблици (Table-driven tests)
- Тестване на грешки
- Тестване на HTTP обработвачи
- HTTP тестови сървъри
- Тестови фикстури
- Покрытие на тестове (Test coverage)
- Бенчмарки
- Примерни тестове
- Тестване на интерфейси с mock-ове или fake-ове
- Практика: Създаване на тестов набор за примерното приложение
21. Оптимизация на производителността
- Разбиране на производителността на Go приложения
- Идентифициране на бутлени (bottlenecks)
- Производителност на CPU срещу памет
- Ефективни данни структури
- Намаляване на ненужните алокации
- Стрингове, байтове и буфери
- Управление на goroutines
- Избягване на прекомерна конкурентност
- Стратегии за кэширане
- Разглеждане на бази данни и мрежа
- Профилиране на приложения
- Бенчмарки и тестване на производителност
- Използване на инструменти за профилиране на Go
- Упражнение: Профилиране и оптимизиране на умишлено неефективно приложение
22. Сигурност и устойчиви практики за уеб приложения
- Валидиране на потребителския вход
- Безопасно обработване на HTTP заявки
- Предотвратяване на чести уеб уязвимости
- Безопасно обработване на грешки
- Концепции за автентикация и авторизация
- Управление на тайни и конфигурация
- Безопасна HTTP комуникация
- Избягване на чувствителна информация в логовете
- Управление и обновяване на зависимостите
- Ограничения на ресурсите и таймауты на заявките
- Упражнение: Преглед и засилване на сигурността на примерното API
23. Логироване и наблюдаемост на приложението
- Основи на логироването
- Структурирано логироване
- Нива на лога
- Логироване на заявки
- Логироване на грешки
- Корелация и ID-та на заявки
- Мониторинг на поведението на приложението
- Базови метрики
- Ендпоинти за проверка на здравето (Health-check endpoints)
- Диагностициране на производствени проблеми
- Практика: Добавяне на структурирано логироване и проверки на здравето
24. Контейнеризиране на Go приложението
- Защо да се използват контейнери?
- Go приложения и контейнеризиране
- Писане на Dockerfile
- Многостъпкови изграждания (Multi-stage builds)
- Изграждане на минимален runtime образ
- Управление на конфигурацията чрез променливи на средата
- Мрежова комуникация на контейнерите
- Експониране на портовете на приложението
- Пускане на приложението в контейнер
- Тестване на контейнеризираното приложение
- Практика: Пакетиране на примерното Go приложение като готов за производство контейнер
25. Внедряване
- Подготовка на приложението за производство
- Изграждане на производствени бинарни файлове
- Конфигурация на средата
- Внедряване чрез контейнери
- Архитектура на внедряването
- Обратни прокси (Reverse proxies)
- Разглеждане на HTTPS/TLS
- Проверки на здравето на приложението
- Безпроблемно спиране (Graceful shutdown)
- Обработка на сигнали от операционната система
- Мащабиране на Go уеб приложения
- Хоризонтално срещу вертикално мащабиране
- Базово отстраняване на проблеми при внедряването
- Практика: Внедряване на примерното уеб приложение
26. Capstone: Пълно Go уеб приложение
Участниците събират концепциите заедно, като разработват пълно приложение.
Проектът може да включва:
- Инициализиране на проекта с Go Modules
- Организация на пакети
- HTTP маршрутизация
- REST API ендпоинти
- Обработка на JSON заявки и отговори
- Валидация на входните данни
- Обработка на грешки
- Интерфейси
- Конкурентна обработка
- Комуникация с външни API
- Перзистентност в файл или база данни
- Автоматизирани тестове
- Логироване
- Разглеждане на производителността
- Контейнеризиране
- Производствена конфигурация
- Внедряване
27. Преглед и добри практики
- Преглед на основния синтаксис на Go
- Конвенции за кодиране в Go
- Писане на идеоматичен Go код
- Поддържане на простота в кода
- Ефективен дизайн на пакети
- Добри практики за обработка на грешки
- Принципи за дизайн на интерфейси
- Добри практики за конкурентност
- Стратегии за тестване
- Разглеждане на производителността
- Поддържаемост и четимост
- Чести грешки на новите разработчици на Go
- Препоръчителни подходи за продължение на Go разработката
28. Заключение
- Преглед на ключовите концепции
- Преглед на завършеното уеб приложение
- Въпроси и дискусия
- Отстраняване на проблеми с чести реални сценарии
- Препоръчителни следващи стъпки за Go разработката
- Допълнителни Go библиотеки и ресурси от екосистемата
- Повече възможности за изграждане на услуги на Go, готови за производство
Изисквания
- Разбиране на общите принципи на програмирането
Целева аудитория
- Разработчици
Отзиви от участници (5)
Тренирачът доказа, че е експерт по темата, която никога не приемам за само съществуваща. Той предостави много полезни разгледи на индустрийните стандарти.
Giuseppe
Курс - Learning Go Programming
Машинен превод
Ми ми хареса количеството практически упражнения, които извършихме. Лично аз учия като правя нещата, затова беше добре, че Франческо ни предложи много практически упражнения. Трудно ми беше да разбера някои от концепциите от слайдовете, но когато реално се засегнах и успях да имплементирам някои ключови функции на езика, това ми помогна да ги разбера по-добре.
Adam Fitzhugh - OpticoreIT
Курс - Learning Go Programming
Машинен превод
темпът, способността на инструкторите да помагат и поддържат леко по-сложно въпроси.
Andrei Mihai - Viasat
Курс - Learning Go Programming
Машинен превод
Глъбоките познания на Раду и адаптираното темпо за мен.
Adeel Ahmad - Coefficient Data Ltd
Курс - Learning Go Programming
Машинен превод
Гъвкавост на тренера. Изключително подложено курса към нашите конкретни нужди.
Daniel Kurner - Daimler TSS
Курс - Learning Go Programming
Машинен превод