Разработка веб-сервисов на Golang (Go), Василий Романов, stepik Этот курс был создан в 2017 году на основе внедрения языка Go в Почту Mail.ru
3 части, 12 недель
https://stepik.org/course/187490/syllabus
- 1.1 Правила, чат поддержки, код к лекциям и домашние задания
- 1.2 Начало работы
- 1.3 Основы языка
- 1.4 Функции
- 1.5 Структуры и методы
- 1.6 Интерфейсы
- 1.7 Практический пример - программа уникализации с тестами
- 1.8 Задание 1 - программа вывода дерева файлов
Неделя 2 - асинхронная работа, Часть 1
- 2.1 Методы обработки запросов
- 2.2 Горутины и каналы
- 2.3 Инструменты для многопроцессорного программирование
- 2.4 Состояние гонки
- 2.5 Задание 2 - асинхроннй пайплайн
Неделя 3 - json и бенчмарки, Часть 1
- 3.1 JSON
- 3.2 Работа с динамическими данными
- 3.3 Бенчмарки и производительность
- 3.4 Задание 3 - оптимизация кода
Неделя 4 - основы работы с HTTP, Часть 1
- 4.1 Слушаем сетевое соединение
- 4.2 Обработка HTTP-запросов
- 4.3 Шаблонизация
- 4.4 Профилирование веба
- 4.5 Телеграм бот
- 4.6 Задание 4 - тестовое покрытие для сервиса поиска по XML
- 5.1 Приветствие
- 5.2 Middleware
- 5.3 Роутинг http-запросов
- 5.4 Валидация входящих данных
- 5.5 Фреймворки
- 5.6 Логирование
- 5.7 Веб-сокеты
- 5.8 Шаблонизация
- 5.9 Задание 5 - веб-фреймворк на основе кодогенерации
Неделя 6 - базы данных, Часть 2
- 6.1 SQL
- 6.2 KV-хранилища
- 6.3 Rabbit, Mongodb
- 6.4 Задание 6 - универсальный сервис просмотра содержимого БД
Неделя 7 - основы микросервисов, Часть 2
- 7.1 Что такое микросервис
- 7.2 Делаем микросервис руками
- 7.3 protobuf и gRPC
- 7.4 Дополнительные темы
- 7.5 Задание 7 - асинхронная система логирования
Неделя 8 - прочие темы, Часть 2
- 8.1 Конфигурирование сервиса
- 8.2 Мониторинг
- 8.3 Низкоуровневое программирование
- 8.4 Инструменты для статического анализа
- 8.5 Задание 8 - заполнение полей структуры через рефлексию
- 9.1 Структурируем приложение
- 9.2 Тестируем комплексное приложение
- 9.3 Авторизация и пароли
- 9.4 CSRF-токены
- 9.5 Сессии
- 9.6 Задание 9 - архитектура типового приложения
Неделя 10 - oauth и рефакториг приложения, Часть 3
- 10.1 OAuth
- 10.2 Немного рефакторинга
- 10.3 Проектирование API
- 10.4 Задание 10 - телеграм бот
Неделя 11 - graphql, Часть 3
- 11.1 Основы GraphQL
- 11.2 GraphQL - интеграция в проект
- 11.3 Организация пакетов в приложении
- 11.4 Задание 11 - маркетплейс на основе GraphQL
Неделя 12 - сборка, s3 и трейсинг, Часть 3
- 12.1 Сборка docker-контейнера
- 12.2 Хранение файлов в проекте через S3
- 12.3 Конфигурирование приложения
- 12.4 Трейсинг запросов
- 12.5 Обратная связь
- 12.6 Задание 12 - многопользовательская MUD на основе асинхрона
Код ко всем лекциями можно скачать по следующей ссылке:
- https://stepik.org/media/attachments/lesson/1177827/golang_web_services_2023-12-28.zip
- https://stepik.org/media/attachments/lesson/1177827/golang_web_services_2024-04-26.zip
Данный код проверен на версии языка go 1.20. В папке каждой недели есть домашка, она находится в подпапке
99_hw
. При работе с консолью пользуйтесь Bash.
Я уже скачал (доступные версии):
У меня винда11 и WSL, поэтому я себе сделал такой раннер для кода:
pushd /mnt/c/Users/${LOGNAME}/data/github/golang-web_services-mrg_course/sandbox
alias gr='bash -vxe /mnt/c/Users/${LOGNAME}/data/github/golang-web_services-mrg_course/run.sh'
# всё запускаемое можно найти в скрипте
bash
Относится ко всем "домашкам": реализован только необходимый минимум. Тесты зеленые и ладно. Надо бы сделать "правильно":
make it work, make it right, make it fast.
Numeric constants represent exact values of arbitrary precision and do not overflow. Consequently, there are no constants denoting the IEEE-754 negative zero, infinity, and not-a-number values.
Напиши библиотечные функции:
- Предикат
IsInvalidFloat
, используемый в фильтрации коллекции чисел. Инвалид: inf, nan - Сравнения двух чисел float, с учетом дельты, +/- zero, nan, +/- inf
Two's complement is achieved by:
- Step 1: starting with the equivalent positive number.
- Step 2: inverting (or flipping) all bits – changing every 0 to 1, and every 1 to 0;
- Step 3: adding 1 to the entire inverted number, ignoring any overflow.
Напиши отображение 32-бит числа в int32, uint32. Битовое представление не меняется, меняется интерпретация набора бит. Рассмотри два случая: int32 получен как результат хеширования и 1) надо отобразить диапазон значений на uint32. 2) надо сохранить битовое представление.
Напиши конвертеры: (u)int => bitstring, bitstring => u(int).
Напиши параллельную обработку по трем паттернам https://habr.com/ru/companies/timeweb/articles/770912/
week 4, extra homework Часть задания, в которой надо реализовать поиск "юзеров" в файле XML, согласно переданным параметрам.
week 6, homework Сделан только необходимый минимум. Надо бы навести красоту, отрефакторить, поработать над эффективностью, валидацией. Добавить поддержку большего количества кейсов (типов данных, комбинаций параметров колонок).
week 9, homework Сделан только необходимый минимум. Надо бы сделать "правильно" и с прицелом на масштабируемость.
Сделан только необходимый минимум. Надо бы сделать "правильно" и с прицелом на масштабируемость.
Communicating Sequential Processes
by Tony Hoare- https://cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/csp.html
- http://www.usingcsp.com/cspbook.pdf
- CSP vs Actor model (channels vs actor/mailbox)
- If a map isn’t a reference variable, what is it?
- Implementing a bignum calculator with Rob Pike
- Lexical Scanning in Go - Rob Pike
- Advanced Topics in Programming Languages: Concurrency/message passing Newsqueak, prime sieve on channels
- [3.5 Years, 500k Lines of Go (Part 1)][https://npf.io/2017/03/3.5yrs-500k-lines-of-go/]
return fmt.Errorf("While doing foo: %v", err.Error())
- The Go Playground https://go.dev/play/ or https://play.golang.com/
- Practical Go: Real world advice for writing maintainable Go programs / Dave Cheney https://www.google.com/search?q=Practical+Go%3A+Real+world+advice+for+writing+maintainable+Go+programs+%2F+Dave+Cheney
- http routing benchmark https://github.com/julienschmidt/go-http-routing-benchmark
- grpc, фреймворк использующий protobuf https://grpc.io/
- https://blog.carlana.net/post/2016-11-27-how-to-use-go-generate/
- How to include Git version information in Go https://blog.carlana.net/post/2023/golang-git-hash-how-to/
- Василий Романов, Как Стать Синьером https://youtu.be/gqJfANPrNm4?feature=shared
- Василий Романов, Уроки Проекта с Коммитом 2001 г. https://youtu.be/bK775SnBA-I?feature=shared
docker
- https://docs.docker.com/compose/environment-variables/variable-interpolation/#substitute-with---env-file
- https://docs.docker.com/compose/environment-variables/variable-interpolation/#env-file-syntax
- https://stackoverflow.com/questions/20635472/using-the-run-instruction-in-a-dockerfile-with-source-does-not-work
- https://docs.docker.com/compose/use-secrets/
- https://docs.docker.com/compose/compose-file/09-secrets/
- https://docs.docker.com/reference/dockerfile/
- https://docs.docker.com/reference/cli/docker/image/build/
- https://dev.to/mjnaderi/accessing-host-services-from-docker-containers-1a97
- https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach
make
- https://www.gnu.org/software/make/manual/html_node/Using-Variables.html
- https://gist.github.com/mihow/9c7f559807069a03e302605691f85572
User settings: ~\AppData\Roaming\Code\User\settings.json
...
"gopls": {
"ui.diagnostic.analyses": {
"stringintconv": false,
"printf": false
}
},
"go.vetFlags": [
"-printf=false"
],
"go.lintFlags": [
"-stringintconv=false"
],
...
snippets
- add cursors: CTRL+SHIFT+L https://code.visualstudio.com/docs/editor/codebasics#_multiple-selections-multicursor