Пишем полезного Telegram бота на Golang | Урок #4 - EventProcessor, Storage
Vložit
- čas přidán 7. 06. 2024
- В этом уроке мы разберемся с API для взаимодействия с telegram-ботом и напишем модуль clients/telegram, который будет выполнять функции клиента для этого API.
Ссылка на итоговый проект на гитхабе: github.com/JustSkiv/read-advi...
На коммиты по урокам не разбито, так как изначально собирался записать один большой урок.
Картинка на превью добавлена с разрешения её автора, за что ему большое спасибо.
Его профиль на Хабре: habr.com/ru/users/oWart/
Тайм-коды:
00:00 Вступление
00:15 Начинаем писать Fetcher и Processor
04:47 Почему отложили EventProcessor
04:57 Создаем Storage
07:02 Реализация интерфейса Storage: files
07:27 Метод files/storage.Save()
09:48 Метод page.Hash(): создание хэша страницы
12:06 Функция files/fileName()
12:45 Доделываем метод files/storage.Save()
15:04 Метод files/storage.PickRandom()
18:14 Метод files/storage.Remove()
19:01 Метод files/storage.IsExists()
20:22 Заключение
Спасибо за такие уроки) очень полезно видеть такие примеры хорошего кода)
Спасибо за урок, пробовал сам методы для начала делать, а потом смотреть как ты это делаешь)
Очень хороший опыт, кстати)
Был очень удивлен, что есть такой контент в открытом доступе. По поводу пользовательских типов, с удовольствием бы посмотрел видео
В открытом доступе есть много хорошего контента =)
@@nikolay_tuzov здравстуйте! Спасибо Вам за ваши видеоролики! Хотел спросить, видео по пользовательским типам вышло-таки, или нет?
Что классно в бобре - ты можешь открыть видео пятилетней давности и с большим шансом там будет актуальный контент.
Очень рад, что мощному и хвалёному процессору - эдакому мачо-вышибале от мира данного проекта, пришлось подвинуться в сторону и отдать львинную долю ролика формированию Стоража (вперёд Стораж!)
Как говорится: НИКТО НЕ СДВИНЕТСЯ С МЕСТА, ПОКА МАЛЫШ СТОРАЖ НЕ СДЕЛАЕТ СВОИ ДЕЛА (ˆˆ)
Нравится, что повествование идёт цельно - доходим до определённого этапа, когда нам нужно дописать функциональность к уже существующим сущностям - топаем и пишем, а не так, что сначала расписали всю начинку сущности и потом просто дёргаем, и никто, кроме автора уже и не понимает зачем? что там делается? почему именно здесь и сейчас?... Нет, тут по другому - и это радует)
Было озвучено предложение по созданию ролика посвящённого gob (стоп, мы подошли из-за угла...) - голосую и плюсую за появление данного ролика, да и в принципе роликов по стандартным библиотекам (может быть, аля рубрика - Очумелые пакеты - где ведущий показывает возможности и область применения пакета стандартной библиотеки в нормальных/предполагаемых условиях, а потом хоба - и использует его в какой-то дичи - и такой, мол - "а оно ведь и так умеет - не костенейте мозгами, го-воины...(братцы, друзья - кому что больше нравится)". Но в целом это так - мысли по древу)
P.S. Радует умелая вставка картинок - они не избыточны, всегда к месту и выполняют главную свою работу - заставляют улыбнуться, донести мозгу - что это не только работа, но весело и занимательно - и он такоооой - ЛАааааадно ужжж, пиши на своём галанге!
P.S.S. В общем, спасибо за урок, и дальнейших успехов!
Как обычно, спасибо большое за такой развёрнутый фидбэк =)
Про gob отметил у себя.
Большое спасибо за интересные уроки!
^_^
Здравствуйте, спасибо за уроки. Хотелось бы поподробнее услышать про алиас для типа int 2:36
Офигенный урок, Николай))
крутые видосы
Радует что видео часто выходят. Уже есть планы что будет дальше после бота?
Да, планы есть. Во-первых, я ещё не закончил с серией уроков по архиватору, и планирую довести это до конца.
После этого попробую отдельные видео записывать, не сериями. Какие-то интересные вещи, которые касаются Go. Например, интерфейсы, context, конкурентность, reflection, atomic, какие-то вопросы оптимизации и т.п.
Николай, спасибо за подробные уроки! Круто было бы увидеть разбор server side, на каком-нибудь фреймворка типа echo и без него, с применение DI.
Спасибо =) Не очень понял, что имеется ввиду под "разбором server side". Пример написания какого-нибудь API-сервиса с фреймворком и без?
@@nikolay_tuzov да, верно) P. S. Плюс с авторизацией по токену или сессией в куках) Реально мало полноценной и подробной инфи для начинающих (на русском языке).
Окей, понятно) Да, можно что-то подобное сделать.
супер, очень понравилось, только по скорости не успеваю, приходится останавливаться и мотать)
Да, была такая проблемка, в новых роликах исправился
почему save и remove возвращают ошибку а не, например, сохраненную ссылку или айди удаленной ссылки?
в методе PickRandom переменная file осталась подчеркнута красным, что то не так с кодом
11:10 а почему не сделать слайс из юзеров для пэйджа? тогда все страницы будут в 1 экземпляре и их можно будет хранить в 1 месте.
12:09 ещё вопрос почему func (s Storage) Save() а не func (s *Storage) Save() ?
4:01 Можно назвать Dispatcher
почему когда реализуем defer используем дополнительно func а не сразу e.WrapIf?
чтобы присвоить значение err. e.WrapIf просто возвращает его, а не обновляет
Николай, у тебя кто нибудь проходит код ревью?))
В каком смысле? На работе у нас есть командное код-ревью, любой MR ревьюит вся команда, как правило. То есть, и я смотрю код коллег, и они мой.
так и не понял, какая, в данном случае, полезная нагрузка у интерфейса Storage?
а в чем принципиальное отличие этих двух строк?
defer func() { _ = f.Close() }()
defer f.Close()
в первом случае мы явно игнорируем ошибку возвращаемую методом Close?
8:20 по-моему винде уже давно всё равно какие слеши ей кормить.
Автор с такой легкостью пользуется возможностями IDE не уделяя внимание тому что не у всех стоит это IDE хотя бы потому что оно платное, и легким движением руки генерирует половину кода и изменений в нем, очевидно, ехидно понимая, что после всех этих автоматических преобразований код записанный за ним вручную по видео не заработает. Или не понимает. Про автоматически генерящийся import я уже упоминал в комментах под предыдущими роликами. Теперь автоматическое переименовывание переменной. Отличный ход. Мы все ближе к тому что код не заработает. Я понимаю, что можно сходить на Git и скачать итоговый код, но разобраться в коде, который уже написан, в разы сложнее, чем в том коде который ты написал своими руками создавая последовательно его структуру. Это момент обучения. Автор, явно, упускает этот момент. Все очень быстро, круто, клево, но в итоге вангую ничего не заработает.
Справедливое замечание. Я прекрасно понимаю, что не у всех стоит GoLand. Но, с другой стороны, тот же VSCode не намного хуже по функционалу, а местами и лучше. И он бесплатный.
В любом случае, я всегда стараюсь держать баланс между понятностью и динамичностью. Если я буду переименовывать каждую переменную отдельно руками, ролик станет очень скучным. Но и понятностью не пренебрегаю - в предыдущих роликах я прямо на монтаже вырезал существенные куски, и люди писали что непонятно откуда что берётся, я это учёл и стал меньше вырезать.
По поводу сгенерированного когда - он ведь всегда представлен на экране. Не все ли равно - напечатал я его у вас на глазах или сгенерировал автоматически? Можно нажать на паузу и почитать, если требуется
@@nikolay_tuzov иногда все настолько быстро, что найти момент где сгенерированный код есть и пол экрана не перекрыто всплывающими подсказками очень трудно. И у меня VSCode и он почему то ничего не дописывает и импорт не генерирует. Может версия какая то. В целом ничего не меняйте, подача отличная. В конечном итоге все равно придется идти за кодом в Git.
@@alqueswan7164 могу скинуть статью как GoLand активировать )
На самом деле соглашусь. Все настолько молниеносно рассказывается и пишется, что "понять с нуля" ну прям не возможно. А те кто пишут и воспринимают с такой же скоростью, способны на аналогичные действия самостоятельно :( Поэтому фраза из первого урока "Я хочу чтобы вы научились делать и сами могли дальше совершенствовать" (или типа того) - немного не укладывается в формат подачи )
Но за видео конечно спасибо!
@@DigneZzZ а что конкретно непонятно? Приходи в наш чатик, обсудим. Если что-то непонятно, я или кто-то из ребят поможет: t.me/+WyjmnP6la_QyYjAy