Пишем полезного Telegram бота на Golang | Урок #5 - пишем EventProcessor

  Рет қаралды 9,816

Николай Тузов — Golang

Николай Тузов — Golang

Күн бұрын

В этом уроке мы напишем EventProcessor, который реализует интерфейсы Fetcher и Processor.
Также разберем несколько интересных и полезных моментов. Например, как сделать общее поле типа, которое будет выглядеть по разному для разных частных реализаций. Также обсудим, как сократить длинные цепочки вызовов функций с помощью замыканий.
Ссылка на итоговый проект на гитхабе: github.com/JustSkiv/read-advi...
На коммиты по урокам не разбито, так как изначально собирался записать один большой урок.
Картинка на превью добавлена с разрешения её автора, за что ему большое спасибо.
Его профиль на Хабре: habr.com/ru/users/oWart/
Тайм-коды:
00:00 Вступление
00:15 Доделываем функцию New()
00:42 Вспоминаем как выглядит интерфейсы Fetcher/Processor
00:54 Метод Fetch()
01:35 Функция event()
02:11 Определяем объект IncomingMessage
03:57 Доделываем функцию event()
04:34 Общее поле Meta
05:53 Снова доделываем event()
06:18 Доделываем Fetch()
08:16 Метод Process()
09:31 Функция meta()
10:05 Команды
10:47 Функция doCmd()
14:01 Функция isAddCmd()
15:22 Команда savePage()
16:35 Тексты ответов бота
18:19 Добавляем в ответы смайлики
19:05 Доделываем savePage()
19:26 Совет: как сократить длинные строчки вызовов с помощью замыканий
21:49 Команда sendRandom()
22:24 Fix: переносим ошибку ErrNoSavedPages в пакет storage
23:00 Доделываем sendRandom()
23:30 Команды sendHelp() и sendHello()
23:44 Расставляем команды в роутере
24:49 Доделываем processMessage()
25:20 Смотрим, что сделали
25:41 Заключение

Пікірлер: 26
@AleksandrPopov-te8tq
@AleksandrPopov-te8tq Ай бұрын
вообще суперский "видекурс", было бы славно посмотреть еще что-нибудь подобное. Совсем начинающим самое то)
@user-pt4iz2py6k
@user-pt4iz2py6k 2 жыл бұрын
Опять же - автор проговаривая свои мысли и действия при создании комманд не только даёт понять, что он имеет богатый опыт в сфере разработки и его решения являются взвешенными, но и таким новичкам как я помогает думать о том, что нужно иногда думать прежде чем везте интерфейсы интерфейсничать 12:10 - а если НЕ ПИШУТ, то скоро ПОПЛЯШУТ *бадам-тссс* 19:30 создаём новые переменные err (52 и 56 строки)? Это чем-то обосновано или можно просто через = перезаписывать значение имеющейся переменной err? 24:28 Давайте уж расставим 😉 😃 25:10 Я сделяль - потому что теперь знаю, что делать)) Спасибо за ещё один урок!)
@nikolay_tuzov
@nikolay_tuzov 2 жыл бұрын
> создаём новые переменные Мы создаём переменную с минимально возможным контекстом - она доступна только в пределах блока if, и именно в нём мы её и используем. А если мы не хотим её использовать за её пределами, то зачем расширять контекст? :) Жаль, это не всегда возможно.
@nikolay_tuzov
@nikolay_tuzov 2 жыл бұрын
@Semen Sporysh я понимаю, да. Не важно, что она там уже есть. Важно, что у нас есть выбор - использовать общий контекст функции, или ограничиться блоком if. И нам достаточно последнего.
@user-yh8eb8bx6m
@user-yh8eb8bx6m Жыл бұрын
Видео понравилось, автору респект)
@evgen_sr
@evgen_sr Жыл бұрын
Если команд будет много, можно как то запускать функции автоматом, без switch case? например в мапе хранить имя функции = команда из телеграм клиента. Вот только как вызывать функции по имени?
@annonymous8220
@annonymous8220 3 ай бұрын
пересматриваю цикл уже раз третий, параллельно переписывая, кажется понимание медленно-медлено приходит. По крайней мере, я точно разобрался с БД, спасибо большое
@nikolay_tuzov
@nikolay_tuzov 3 ай бұрын
Это нормально, понимание часто приходит не сразу
@ik7122012
@ik7122012 4 ай бұрын
Спасибо за видео! Возник вопрос по поводу оффсета, если у нас серьезное приложение, а не простенький бот, нужно ли оффсет хранить в бд? Ведь если у нас по какой то причине крашнется приложение и мы его рестартанем, то оффсет снова будет нулевым, а значит уже обработанные сообщения снова обработаются, не так ли? В случае с ботами, в которых есть какие то финансовые операции это довольно критично получается. Но с другой стороны на каждый апдейт дергать базу, чтобы положить одно значение тоже не комильфо 🤔
@evgenyvlasov851
@evgenyvlasov851 2 жыл бұрын
25:13 "вы уже знаете что делать?" - Что же? :) про closures было тоже интересно урок. Спасибо.
@nikolay_tuzov
@nikolay_tuzov 2 жыл бұрын
Я до этого момента уже показывал - вынести обработку ошибки в defer =)
@user-vl3np9ck3v
@user-vl3np9ck3v 2 жыл бұрын
Подскажи пжлста, что за комбо, когда ты выделяешь текс и создаешь функцию с именем выделенного текста? Или это макрос? ( есть ли подобное на VSC)? Спасибо.
@nikolay_tuzov
@nikolay_tuzov 2 жыл бұрын
Я пишу код в GoLand. Если там написать вызов несуществующей функции, то можно нажатием Alt + Enter создать её. При этом, у неё будет правильная сигнатура (т.е. набор аргументов и возвращаемые значения), довольно удобно. Но, на самом деле, я часто просто вырезаю некоторые моменты, когда что-то печатаю, т.к. это смотрится скучно. Поэтому, лучше покажи конкретный момент на видео, и я скажу, что я там использовал :)
@user-vl3np9ck3v
@user-vl3np9ck3v 2 жыл бұрын
@@nikolay_tuzov там видно, что это не вырезанный процесс печати, а создание, т.к. выскакивает окно выбора действий. Благодарю)
@chmod1010
@chmod1010 Жыл бұрын
в vs code ctrl+.
@surt16
@surt16 Жыл бұрын
Спасибо за видео. Есть замечание по поводу обработки ошибок. Во всех видео вижу, что ошибки оборачиваются с одним и тем же текстом, для чего и добавляется дефер, иногда. Не было бы правильнее оборачивать их с разным текстом, чтобы было понятно, на каком моменте возникла ошибка? Например в processMessage дописать при получении меты, что ошибка в получении меты, а при обработке команды, что проблема с ней, а общее сообщение, о невозможности обработки сообщения добавить при оборачивании ошибки, возвращаемой методом processMessage? Сам так делаю, и поэтому решил указать. Если есть аргументы в пользу такого способа, хотел бы услышать)
@eamarc
@eamarc Жыл бұрын
с текстом заморачиваться смысла особо нет (при логировании caller доведет до нужного места), но если дальнейшая логика обработки от этого зависит (например за мету хочется вернуть 500ю, а за команду 400ю), то есть смысл ввести типы ошибок ExternalError, UserError...
@stylizedworld8601
@stylizedworld8601 2 жыл бұрын
Используется го на фрилансе, в маленьких проектах? Или в основном только в крупных компаниях типо озона?
@nikolay_tuzov
@nikolay_tuzov 2 жыл бұрын
Точно не знаю, т.к. работал на Го только в крупных компаниях. Но могу сказать так - он точно используется в мелких проектах крупных компаний.
@stylizedworld8601
@stylizedworld8601 2 жыл бұрын
@@nikolay_tuzov Спасибо за ответ. Го у меня как первый язык, но слышал что в го идут уже миддлы+ с других языков и типо джунов в го не бывает. Действительно так все, и лучше идти на какой нибудь пайтон, потом уже на го пересаживаться.
@Hande_hoch
@Hande_hoch Жыл бұрын
3:48 не понял, какая разница. Что будет, если придёт нил, а там поле не ссылка?
@Hande_hoch
@Hande_hoch Жыл бұрын
а, кажись понял, если не ссылка, то нельзя сравнить на нил
@xpascalabcd
@xpascalabcd 2 жыл бұрын
Что с гофером? Он стал такой худой
@nikolay_tuzov
@nikolay_tuzov 2 жыл бұрын
Который из них? =)
@xpascalabcd
@xpascalabcd 2 жыл бұрын
@@nikolay_tuzov в самом начале. Робогофер
@nikolay_tuzov
@nikolay_tuzov 2 жыл бұрын
@@xpascalabcd да вроде обычный..
СҰЛТАН СҮЛЕЙМАНДАР | bayGUYS
24:46
bayGUYS
Рет қаралды 769 М.
Golang's Mocking Techniques - Kyle Yost | hatchpad Huddle
41:20
Тайные знания о GoLang, которые от вас скрывали / 1 апреля
20:30
Пишем полезного Telegram бота на Golang | Урок #4 - EventProcessor, Storage
20:38
05 Психология поведения
1:16:23
Ψ
Рет қаралды 254 М.
Генерация и использование моков в Go / Mockery
23:35
Николай Тузов — Golang
Рет қаралды 15 М.
Кто такой системный архитектор? / GoGetPodcast №11
2:05:14
Николай Тузов — Golang
Рет қаралды 3,5 М.