Пишем полезного Telegram бота на Golang | Урок #5 - пишем EventProcessor
Vložit
- čas přidán 31. 05. 2024
- В этом уроке мы напишем 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 Заключение
вообще суперский "видекурс", было бы славно посмотреть еще что-нибудь подобное. Совсем начинающим самое то)
Опять же - автор проговаривая свои мысли и действия при создании комманд не только даёт понять, что он имеет богатый опыт в сфере разработки и его решения являются взвешенными, но и таким новичкам как я помогает думать о том, что нужно иногда думать прежде чем везте интерфейсы интерфейсничать
12:10 - а если НЕ ПИШУТ, то скоро ПОПЛЯШУТ *бадам-тссс*
19:30 создаём новые переменные err (52 и 56 строки)? Это чем-то обосновано или можно просто через = перезаписывать значение имеющейся переменной err?
24:28 Давайте уж расставим 😉 😃
25:10 Я сделяль - потому что теперь знаю, что делать))
Спасибо за ещё один урок!)
> создаём новые переменные
Мы создаём переменную с минимально возможным контекстом - она доступна только в пределах блока if, и именно в нём мы её и используем. А если мы не хотим её использовать за её пределами, то зачем расширять контекст? :) Жаль, это не всегда возможно.
@Semen Sporysh я понимаю, да. Не важно, что она там уже есть. Важно, что у нас есть выбор - использовать общий контекст функции, или ограничиться блоком if. И нам достаточно последнего.
Видео понравилось, автору респект)
пересматриваю цикл уже раз третий, параллельно переписывая, кажется понимание медленно-медлено приходит. По крайней мере, я точно разобрался с БД, спасибо большое
Это нормально, понимание часто приходит не сразу
Если команд будет много, можно как то запускать функции автоматом, без switch case? например в мапе хранить имя функции = команда из телеграм клиента. Вот только как вызывать функции по имени?
25:13 "вы уже знаете что делать?" - Что же? :) про closures было тоже интересно урок. Спасибо.
Я до этого момента уже показывал - вынести обработку ошибки в defer =)
Спасибо за видео! Возник вопрос по поводу оффсета, если у нас серьезное приложение, а не простенький бот, нужно ли оффсет хранить в бд? Ведь если у нас по какой то причине крашнется приложение и мы его рестартанем, то оффсет снова будет нулевым, а значит уже обработанные сообщения снова обработаются, не так ли? В случае с ботами, в которых есть какие то финансовые операции это довольно критично получается. Но с другой стороны на каждый апдейт дергать базу, чтобы положить одно значение тоже не комильфо 🤔
Подскажи пжлста, что за комбо, когда ты выделяешь текс и создаешь функцию с именем выделенного текста? Или это макрос? ( есть ли подобное на VSC)? Спасибо.
Я пишу код в GoLand.
Если там написать вызов несуществующей функции, то можно нажатием Alt + Enter создать её. При этом, у неё будет правильная сигнатура (т.е. набор аргументов и возвращаемые значения), довольно удобно.
Но, на самом деле, я часто просто вырезаю некоторые моменты, когда что-то печатаю, т.к. это смотрится скучно.
Поэтому, лучше покажи конкретный момент на видео, и я скажу, что я там использовал :)
@@nikolay_tuzov там видно, что это не вырезанный процесс печати, а создание, т.к. выскакивает окно выбора действий. Благодарю)
в vs code ctrl+.
Спасибо за видео. Есть замечание по поводу обработки ошибок. Во всех видео вижу, что ошибки оборачиваются с одним и тем же текстом, для чего и добавляется дефер, иногда. Не было бы правильнее оборачивать их с разным текстом, чтобы было понятно, на каком моменте возникла ошибка? Например в processMessage дописать при получении меты, что ошибка в получении меты, а при обработке команды, что проблема с ней, а общее сообщение, о невозможности обработки сообщения добавить при оборачивании ошибки, возвращаемой методом processMessage?
Сам так делаю, и поэтому решил указать. Если есть аргументы в пользу такого способа, хотел бы услышать)
с текстом заморачиваться смысла особо нет (при логировании caller доведет до нужного места), но если дальнейшая логика обработки от этого зависит (например за мету хочется вернуть 500ю, а за команду 400ю), то есть смысл ввести типы ошибок ExternalError, UserError...
Используется го на фрилансе, в маленьких проектах? Или в основном только в крупных компаниях типо озона?
Точно не знаю, т.к. работал на Го только в крупных компаниях. Но могу сказать так - он точно используется в мелких проектах крупных компаний.
@@nikolay_tuzov Спасибо за ответ. Го у меня как первый язык, но слышал что в го идут уже миддлы+ с других языков и типо джунов в го не бывает. Действительно так все, и лучше идти на какой нибудь пайтон, потом уже на го пересаживаться.
3:48 не понял, какая разница. Что будет, если придёт нил, а там поле не ссылка?
а, кажись понял, если не ссылка, то нельзя сравнить на нил
Что с гофером? Он стал такой худой
Который из них? =)
@@nikolay_tuzov в самом начале. Робогофер
@@xpascalabcd да вроде обычный..