Плюсы и минусы
Сферы применения
Кто использует
02
Переменные и элементарные типы данных
Типизация в Go
Объявление переменной
Операция присваивания
Указатели
Расположения переменных в памяти
Понятие "zero value"
Приведение типов
Дженерики
03
Управляющие конструкции языка и отладка программ
Конструкции if ... {} else {}, switch
Условия и логические операции
Цикл for
Метки
Виды функций.
Сигнатура функции
Передача аргументов в функцию по ссылке и по значению
Области видимости, {}
Ошибки, связанные с областью видимости
Замыкания
Затенения
Определение структур
Инкапсуляция полей структуры
Композиция
Выравнивание
Методы
Утиная типизация
Композиция интерфейсов
Утверждение типов
Конструкция type switch
Определение и реализация интерфейсов
Внутреннее устройство интерфейса
Влияние использования интерфейсов на производительность программы
Значение типа интерфейс и ошибки, связанные с nil
Правила присваивания значений переменным типа интерфейс
Опасное и безопасное приведение типов (type cast)
07
Массивы и слайсы, мапы
Массивы и слайсы, мапы
Длина и ёмкость
Внутренняя структура слайсов и мап
Различные способы итерации
Частые ошибки и затруднения
Строки, руны и массивы байт
Стандартные функции для работы со строками и Unicode
Работа со строками через strings builder
09
Обработка ошибок и паник
Интерфейс error
Конструкция defer
Функции panic и recover.
Кастомные ошибки
Обертывание ошибок
Сопоставление ошибок
Виды и назначение тестов, пирамида тестирования
Понятие табличных тестов
Пакет gomock для тестирования
Golden files
Fuzzing
11
Конкурентность и параллелизм в Golang
Горутины и каналы
Сравнение буферизированных и небуферизованных каналов
Использование каналов для передачи данных и синхронизации
Получение данных из канала: select, range
12
Примитивы синхронизации
Пул объектов sync.Pool
Мьютексы sync.Mutex/RWMutex
Словарь sync.Map
Условные переменные sync.Cond
Группа ожидания sync.WaitGroup, errgroup.WithContext
Атомарные операции - пакет atomic
Гарантировано одноразовое выполнение sync.Once
Понятие сериализации/десериализации
Протоколы JSON, XML, protobuf, gob
Структурные тэги
Архитектура Интернета
Клиент-серверное взаимодействие
Пакет net/http, работа с HTTP
Пакет net, работа с низкоуровневыми протоколами
CRUD, REST
OpenAPI, Swagger
Oauth, basic, jwt
Различные варианты конфигурации программы
Использование простых форматов конфигурации: .ini, .yaml, .json и т.п.
Чтение конфигурации из окружения
Библиотека для работы с конфигурацией: viper
Стандартная библиотека для логирования
Использование интерфейсов для логирования
Расширенное логирование на примере zerolog
17
Работа с базами данных
Реляционные /нереляционные СУБД и области их применения
Основные понятия реляционных БД
Подключение к СУБД и настройка пула соединений
Выполнение SQL-запросов и получение результатов
Стандартные интерфейсы sql.DB, sql.Rows и sql.Tx
Использование транзакций
SQL-инъекции
Работа с базами данных через пакет gorm
Работа с базами данных через пакет sqlx
Сравнение монолитной и микросервисной архитектур
Плюсы и минусы микросервисов
Понятие 12-факторного приложения
Пример микросервисов на Golang (сервис регистрации пользователей и сервис рассылки уведомлений)
gRPC и protobuf
Создание gRPC клиента и сервера, лучшие практики gRPC
Интерсепторы, надежность (ретраи, задержки)
LS при работе с gRPC
Событийно-ориентированные архитектуры
Apache Kafka
NATS
RabbitMQ
Примеры работы с RabbitMQ из Go
Возможные проблемы с очередями: перегрузка, падение обработчиков, сбойные сообщения и пр.
RequestId
OpenTelemetry
Jaeger
22
Паттерны многопоточности
Работа с многими каналами: fan in, fan out
Pipelines
Cancellation
Graceful shutdown
23
Память и сборка мусора
Особенности памяти программы на Go
Выделение и освобождение памяти на стеке и куче
Escape analysis
Механизм сборки мусора в Go.
Обработка аргументов командной строки: flags, pflag
Работа с сигналами ОС
Запуск внешних программ
Стандартные интерфейсы io.Reader, io.Writer и io.Closer
Последовательные и произвольные доступы и интерфейс io.Seeker
Буферизация ввода/вывода и оптимизация копирования
Работа с каталогами
Работа с файлами
Работа с потоками ввода/вывода
Regex
Использование пакета reflect
Плюсы и минусы рефлексии
Reflect.Type и reflect.Value
Примеры использования рефлексии
Пакет unsafe и тип unsafe.Pointer
Понятие кодогенерации инструмент `go generate`
Полезные библиотеки, использующие кодогенерацию: impl, stringer, jsonenums, easyjson и пр.
Работа с AST, практическая кодогенерация
27
Профилирование и оптимизация Go программ
Бенчмарки
Pprof
Профилирование
Cache miss, cache hit
Прогрев кэша
LRU, LFU кэш
Инвалидация кэша
Ленивый кэш
Вытеснение данных
29
Внутреннее устройство планировщика
Основные структуры планировщика: P, M, G
Механизм переключения горутин
Обработка системных и сетевых вызовов планировщиком
30
Итого на программу 80 часов: теория – 40 ч (50%), практика – 40 ч (50%)