❤ Если у вас есть желание поддержать развитие канала: www.patreon.com/tuzov boosty.to/nikolay.tuzov - 👾 Мой канал в Telegram: t.me/ntuzov (здесь же будут новости и доп. информация по конкурсу) - 🗣 Наш чат - Gopher Club: t.me/+zsSZ63wEJDs3NGVi - 👀 Golang Digest: t.me/golang_digest - мои регулярные подборки интересных материалов по Go.
У вас очень хорошая подача материала. Много, но всё чётко и по делу. Как личное пожелание - хотелось бы увидеть добавление к боту машины состояния. Например, что бы пользователь мог запустить интерактивный процесс удаления записей. Бот показывает запись, пользователь отвечает нужно ли её удалить или пропустить. Оверинжениринг в случае данного бота, но иногда такое очень нужно, а толковых инструкций нет.
Добавлю свои пять копеект на предмет контекста. Мне кажется вы зря поменяли интерфейс. То есть, были одни методы, была реализация. По началу вы сделали всё правильно - реализовали интерфейс для нового хранилища. Но теперь, если вы вернётесь к файловому то вам придётся и его менять. Что, имхо, неправильно. Понятно что в данном случае вы единственый кто рулит кодом, но если бы пакет файлового хранилища был бы на аутсорсе то возникли бы проблемы. Как альтернативу яп, наверное, предложил бы передавать контекст в методе инициализации sqlite-хранилища. Тогда бы хранилище бы могло реализовывать существующий интерфейс, но скрывало бы что делает вызовы с контекстом. func (s *Storage) SavePage(p *Page) error { retrun s.savePage(s.ctx, p); } Или это плохая идея хранить контекст в структуре?
Хорошо, что вы задаётесь такими вопросами, но ход мыслей неверный: 1) ошибкой с моей стороны скорее было отсутствие контекста в изначальном интерфейсе. Вы правы - подгонять интерфейс под частные реализации - это плохо. Но контекст важен с подобных интерфейсах - Storage чаще всего будет подразумевать длительные операции, которые нужно ограничивать таймаутом. Если это всего лишь файловая система, то контекст можно просто проигнорировать. Возможно, мне стоило это голосом проговорить в видео. 2) Передавать контекст при инициализации - это совсем мимо. Важно иметь рычаги для управлением конкретными вызовами конкретных функций. На каждый вызов отдельный контекст с отдельным таймаутом. Иначе мы просто отменим сразу все текущие операции, даже хорошие. В этом видео я как раз показал общепринятый подход. Но в целом, повторюсь, хорошо что вы задаётесь этими вопросами и не ленитесь обсуждать. Я бы предложил вам присоединиться к нашему чатику, можем там периодически обсуждать подобное: t.me/+WyjmnP6la_QyYjAy
@@nikolay_tuzov так или иначе, спасибо за реакцию. По сути, на вскидку, сложности с лимитами телеграм (частота запросов к api, частота отправки сообщений ботом во всё чаты 1/30 сек, в один чат в зависимости от объёма сообщений, количество коннектов к вебхук если вебхук, и возможно другие) а также реализация комнат горутинами и каналами. Нюансов много. А значит материал (кстати отсутствующий в виде обучения) востребованный. Добра Вам и успехов в Ваших делах!
Николай, добрый день! Предлагаю запилить финальный и очень нужный ролик в этой серии: "Подготовка бота к деплою на VPS через Docker контейнер". Бот отлично работает, хочется его задеплоить, показать друзьям и начать самому активно пользоваться. Докер на VPS уже развернул, а бота в контейнер завернуть ума не хватает. Спасибо за ваш труд и успехов во всех начинаниях.
Николай, а если бот на go делает запрос к какому-то API для получения данных в JSON и отдаёт пользователю их, нужны ли там рутины? Как вообще понять в какой момент они нужны, когда пользователей 100-1000-10000? Бот для разработки на 100 пользователей и 10000 это очень разные вещи или же бот сразу делается таким, чтобы он мог работать с большим количеством юзеров? На ютубе в основном очень простые видео и мало интересные, по сути такой себе деревянный hello world бот, лишь единичные нормальные видео, а у вас едвали не самый лучший или самый лучший плейлист по боту, где объясняется что-то дальше, чем простейшее и объясняется тщательно, чётко и интересно
Спасибо большое за видео! Понятным и доступным языком, как для меня начинающего. Только есть вопрос по установке go-sqlite3 через утилиту go get. При попытке установить выскакивает ошибка: "компилятор C "gcc" не найден". Подскажите в чем может быть причина, где искать решение?
Не сталкивался с таким. Напиши точный текст ошибки и команду, которую пишешь. А лучше заходи в наш чатик, и задай вопрос там, поможем: t.me/+WyjmnP6la_QyYjAy
Привет, спасибо за серию таких крутых уроков! В твоем репозитории я увидел коммит, в котором ты добавил контекст ко всем методам клиента, добавлял контекст при отправке запроса. И еще ты добавил контекст к методам интерфейса storage, при этом его там не использовал. Ответь пожалуйста, зачем ты это сделал? Где я могу найти ответ на этот вопроc? Может книга есть или статья какая-то?
7:07 "Смотрим, что нам возвращает функция Exec. Это какие-то результаты, которые, в данный момент, нам не особенно интересны, и ошибка. Результат мы проигнорируем, а вот ошибку, конечно же, обработаем" - 🤣 Golang development прекрасен
Подскажите как красиво передать имя таблицы в SQL запрос? Так чтобы IDE по-прежнему понимал диалект sql Понимаю что можно конкатенацию делать или тот же sprintf, но все это не красиво. А держать имя таблиц в константах бывает очень удобно особенно в стадии разработки.