Anonymous
курс от mail.ru на курсере
Anonymous
блокировка чего
Михаил
Блокировка программы
🅞leksiy
Советую почитать про каналы, рутины и блокировки, иначе, без понимания как там все работает, можно наворотить делов. Это не то, с чем надо разбираться, когда уже существует непонятное поведение.
Михаил
А в гоу есть неблокирующие чтения (допустим сокета)? Где почитать?
🅞leksiy
Запускаешь чтение в рутине и результат отправляешь в канал, а там сам разруливаешь, ждать, не ждать, тайм-аут и тп. Через select case
Михаил
А, т.е. без горутины блокирующий сокет?
🅞leksiy
А, т.е. без горутины блокирующий сокет?
Ну, зависит от используемой либы
Михаил
В коробке
🅞leksiy
Я, к сожалению, не помню, есть ли там методы асинхронные. Ну они будут канал возвращать, в таком случае
🅞leksiy
Посмотри доку)
Михаил
Угу, пасиб
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
Ты хотя бы отправил минимальный код твоей проблемы, так быстрее помогут.
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
А вообще да, почитай про каналы и пакет sync. Ооочень полезно и в будущем без этого сложно обойтись.
Emil
Да ничего толкового придумать не могу. Все на закрытие соединений и чтений думаю, но не ровно же минуту каждый раз. Может респонс какой тяжёлый появляется... Может где-то вызовы ушли в цикл... В общем хз)
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
Правильно. Почитай про стек и сборщик мусора. Тоже полезно. Вернуть указатель на структуру производительно при возврате больших структур данных.
🅞leksiy
Сделай просто return &update, err
🅞leksiy
Зачем эти проверки там?
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
Сделай просто return &update, err
Можно же сразу nil вернуть, а не указатель на структуру
🅞leksiy
Ну тогда выше задай тип со *
🅞leksiy
И будет nil
🅞leksiy
По умолчанию
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
Глянь например в библиотеку Syfaro telegram bot api. Он как раз таки возвращает не указатель, а копию структуры, потому что в этом случае скорее всего производительнее.
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
Но я могу ошибаться
Emil
Солидно
Alexander
если побайтово получать, а не пытаться все в память вычитать, то и пофиг
Alexander
ошибка ошибка. лимиты везде нужны
Alexander
и данные валидировать
Maks
А почему не размер файла проверять?
Maks
Ну я к тому что ты проверяешь не стороны а чисто вес
Alexander
круто было б научиться переваривать такое, а потом ограничения вводить)
Maks
А может кто поделиться своим идеальным миром миграций на го. Кто как его видит.
Maks
Почему
Anonymous
кому не тяжело чекните пж реализацию гексагонки(хочу понять правильно ли делаю или нет) https://github.com/kenerase/hexagonal edited: одно только не понятно, хенлдеры пихать в апп или создать отдельный каталог?
Alexey
Лайфхак "как не писать лишние проверки и присваивания" (именованный return): func GetUpdateStruct(bytes []byte) (update *Update, err error) { err = json.Unmarshal(bytes, &update) return } update, err := GetUpdateStruct(bytes) Минус 5-6 строк 😊
Herman
Или я просто не привык, но именованный ретурн, а особенно пустые ретурны меня всегда слегка смущают
Anonymous
https://povilasv.me/go-scheduler/
Anonymous
Круто ничо непонятна
Anonymous
...
Anonymous
Да кто такие эти гоферы
Bagasl
+1
Если и делать именованный возврат - то не делать просто return без названий переменных
Anonymous
заполните форму перед встречей
Anonymous
что это может значить?
L
а тут на любые темы по гохе можно вопросы задавать?
Anonymous
меня взяли?
Maks
:(
L
import runner "github.com/oklog/run" ... func (a app) Start(ctx context.Context) error { var serverGroup runner.Group { serverGroup.Add(func() error { a.bot.Client.Debug = a.cfg.BotDebug a.bot.DB = a.db log.Infof("telegram bot started at account: %s", a.bot.Client.Self.UserName) return a.bot.Start() }, func(err error) { log.Errorf("Error start telegram bot: %s", err) }) } { serverGroup.Add(func() error { a.scheduler.DB = a.db log.Infof("scheduler started with checking interval: %d minutes", a.cfg.SchedulerInterval) return a.scheduler.Start() }, func(err error) { a.scheduler.Stop() log.Errorf("Error start scheduler: %s", err) }) } return serverGroup.Run() } Делаю такой вот кусок. Странное поведение у работы oklog/run INFO[0000] scheduler started with checking interval: 1 minutes ERRO[0000] Error start telegram bot: %!s(<nil>) <- бот не взлетел DEBU[0000] Scheduled task <- планировщик один раз исполнился ERRO[0000] Error start scheduler: %!s(<nil>) <- планировщик упал и остановился из-за .Stop() INFO[0000] telegram bot started at account: somebot <- бот взлетел
L
Есть идеи, если бегло глянуть, где я мог косякнуть?
L
bot отдельно работает, scheduler писал сам, видимо в нем факап
L
var stop chan bool type Scheduler struct { Interval int DB *storage.Database Task func() } func New(task func(), interval int) (s *Scheduler) { s = &Scheduler{ Interval: interval, Task: task, } return } func (s Scheduler) Start() error { return schedule(s.Task, 2*time.Second) } func (s Scheduler) Stop() { stop<- true } func schedule(function func(), delay time.Duration) (err error) { stop = make(chan bool) go func() { for { function() select { case <-time.After(delay): case <-stop: return } } }() return }
L
Сорян если много кода, не вижу в описании или закрепе правил сообщества(
Emil
Как минимум можно вместо %s писать %v (или %w где еррорф), а то ни одной ошибки там не отработало кажется (если стрелочки вручную)
L
мне кажется из логики oklog/run Start() не должен возвращать сразу результат, а работать бесконечно и завершать работу при появлении ошибки
L
буду благодарен, если кто-то подскажет как правильно, если юзал данную концепцию с oklog/run
@Thermophoto
Чем отличается функция fmt. Sprintf от fmt.Printf?
Emil
С вроде возвращает тебе форматированную строку, а обычный ее выводит
Herman
первая возвращает строчку
Andrey
var stop chan bool type Scheduler struct { Interval int DB *storage.Database Task func() } func New(task func(), interval int) (s *Scheduler) { s = &Scheduler{ Interval: interval, Task: task, } return } func (s Scheduler) Start() error { return schedule(s.Task, 2*time.Second) } func (s Scheduler) Stop() { stop<- true } func schedule(function func(), delay time.Duration) (err error) { stop = make(chan bool) go func() { for { function() select { case <-time.After(delay): case <-stop: return } } }() return }
А ты понимаешь, что ты везде работаешь с копиями объекта, а не с тем, у которого вызываешь? Плюс зачем тебе глобальный канал, почему его в структуру не вынести? И еще, если тебе надо "сигналинг" по каналу, то используй минимальный тип канала struct{}, ну или пакет context
Null
Интерфейсы в Go — как красиво выстрелить себе в ногу https://habr.com/ru/post/597461/ @Golang_google
Nikita
Ilya
https://habr.com/ru/company/kaspersky/blog/591725/
Alexander
Гыг)
Belka
У меня есть телеграмм бот, обязан ли я добавить в него рекламу (Sponsored messages), которые нужно добавить до 2022 или это распространяется только на каналы, где уже есть реклама и на неофиц. клиенты
Emil
В плане, через апи телеги рекламу все равно не убрать
Belka
для написания ботов я использую https://github.com/go-telegram-bot-api/telegram-bot-api, но там нет возможности добавить эти Sponsored messages, да и в приницпе инфу о том, что это распространяется на ботов не нашел
@Thermophoto
Никто на стажировку в вайлбериз не устраивался, как там?
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
v̲̅ɭคD☬
Чем?
https://grammy.dev/guide/deployment-types.html#comparison
𝕌ℕ𝔼𝕏ℙ𝔼ℂ𝕋𝔼𝔻
https://grammy.dev/guide/deployment-types.html#comparison
Я знаю что и как работает, мне интересно твоё утверждение.
v̲̅ɭคD☬
Я знаю что и как работает, мне интересно твоё утверждение.
ты прикалываешься?)webhook являются более надежным способом, нежели long polling, часто от polling прилетают 504 ошибка, масштабируемость плохая и т.д.