.
Ну вот в MySQL если я не ошибаюсь, ты вставляешь строку первым запросом, потом кто тоже вставляет строку сразу после тебя, и твой второй запрос на last_insert_id() вернет айди строки второго человека
.
Это Postgres умный и может вернуть что хочешь из вставляемой строки
doc
Ребята, юзайте returning из базы, вы че тут придумываете??
🎉
я не понимаю, что тут у тебя за chatId и что ты вообще тут показываешь
Пусть будет не chatID, пусть будет firstName, это я из бота копипастнул.
.
да
Я так понимаю это распространенный подход?
Aleksandr
Пусть будет не chatID, пусть будет firstName, это я из бота копипастнул.
давай у нас репозиторий будет работать с User, а не firstName
🎉
Ну окей, что меняет-то? Вернуть из базы id последней записи проще же, не?
🎉
Единственный косяк который я вижу, это что int закончится.
Aleksandr
Ну окей, что меняет-то? Вернуть из базы id последней записи проще же, не?
репозиторий - это интерфейс к хранилищу. Не к базе. Хранилище может быть без автоинкрементных id.
Aleksandr
меняем реализацию репозитория и наш код перестает работать, потому что id не возвращается
doc
Единственный косяк который я вижу, это что int закончится.
Сомневаюсь, что у вас такие объемы, что он закончится
🎉
Ну, мало-ли, делит, инсёрт частый.
Aleksandr
то что ты предлагаешь - это называется "текут абстракции". Ты репозиторий реализуешь так, как будто бы знаешь что он будет mysql
Aleksandr
а должен реализовывать так, как будто там может быть что угодно
Aleksandr
поэтому мы можем просто UserStore сделать как предлагаешь ты например. Либо репозиторий
🎉
Не, я делаю через модель, переписать только запросы в базу и всё. Вот по такой схеме https://habr.com/post/329582/
Kirill
🤦‍♂
Илья
🤦‍♂
Почувствовал себя насильником? :-D
Kirill
Почувствовал себя насильником? :-D
Более того, это мне моя девушка скинула. Которая в БГУИРе учится
aadz
насильница какая!
Илья
Программист теоретик, горе в семье
Илья
Откуда у них эти «шуточки»
aadz
Внизу доска, а сверху - "презентация"... Вобще, кажется, что материал лучше усваивается, если лектор это прямо тут же далает все на доске! Но так сложней готовиться к лекции, для лектора :(
Евгений
Товарищи не подскажите как кильнуть time.Sleep(time.Until(nextExecute)) ? А то после CTRL+C приложение еще может минуту висеть пока SIGINT дойдет....😞 func SessionCleanupTask() { var quit = make(chan os.Signal) signal.Notify(quit, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) // kbdloss,ctrl+c,terminate,quit for { select { case <- quit: return default: nextExecute := time.Now().Add(time.Minute) time.Sleep(time.Until(nextExecute)) log.Println("peek: SessionCleanupTask") } } } func init() { go SessionCleanupTask() }
aadz
никак
aadz
если ты уже кого-то загнал в sleep - он будет спать, пока время не пройдет
Евгений
А альтернативый способ сделать background таск с выполнением по времени или до сигнала?
aadz
или до таймаута в switch
Евгений
Так пологаю что это отдельный сигнал который прописываеться в сase и замораживает рутну пока таймер не свиснет?
aadz
нет, не совсем правильно полагаешь
Евгений
А как тогда? Есть еще package https://godoc.org/github.com/robfig/cron он в принцепе работает нормально, но хочется поменьше библиотек...
Евгений
Темболее задачка наипростейшая
aadz
угу
Daniel
У таймера есть стоп и канал. Радость в том, что при стопе в канал уходит сообщение
aadz
Слушаю лекции про Go Васи Романова. Ничего так, нормально про Go рассказывает. про Go
aadz
https://www.youtube.com/watch?v=9Pk7xAT_aCU
Zver
У таймера есть стоп и канал. Радость в том, что при стопе в канал уходит сообщение
Стоп только с ограничениями работает, да ещё и работа стопа не соответствует документации.
Pawel
в реальности 12 факторов таки рулят
twelve-factor-app - об этом речь?
aadz
просто убрать секцию default либо сделать time.Sleep(10*time.Milisecond) Секция дефаулт нужна если бдействительно хотите ДОБАВИТЬ логику простоя! Если же тупое ожидание то делайте самым простым способом!
Ты хочешь рассказать о методиках программирования человеку, который даже живого языка (родного) освоить не смог, а сразу взялся за формальные, типа Go?
aadz
🎉
А какие есть распространённые практики использования http.Handle и http.HandleFunc? Я так понимаю, первое гибче, но не работает с роутами горилы ибо оно требует второе. Есть какие-то трюки юзать горилу с первым вариантом?
Мерль
Спасибо, пошёл читать.
а так http.Handle и http.HandleFunc полностью взаимозаменемы https://play.golang.org/p/c9h4-lEn1tR
Евгений
Читай из 2 каналов: Select{ Case <- quit: return Case <- time.After(time.Minute): Log.... } Писал с тлф, но идея понятна )
Пробывал... Сейчас программа перестала вовсе реагировать на Ctrl+C... Точнее грохаеться SessionCleanupTask, a http.ListenAndServe продалжает работать... Я так пологаю что поток уже один раз получил свой сигнал и повторно он уже получить не может?
Anonymous
Пробывал... Сейчас программа перестала вовсе реагировать на Ctrl+C... Точнее грохаеться SessionCleanupTask, a http.ListenAndServe продалжает работать... Я так пологаю что поток уже один раз получил свой сигнал и повторно он уже получить не может?
не туда смотришь! Старайся понять что написано! Твой SessionCleanupTask() просто завершается , нет логики выхода из приложения , мейн же просто запустил рутину SessionCleanupTask() и пошел дальше! На лицо непонимание основных конструкций языка!
Евгений
Хорошо как тогда правельно ее реализовать?
Anonymous
рутина должна сообщить основному потоку main о своем завершении , думай как
Anonymous
завершение основного потока main - ЗАВЕРШЕНИЕ ПРОГРАММЫ
Евгений
Ну хоть какой-то пример выхода из данной ситуации?
Евгений
То-есть насколько я понял что проблема зависания в: func init() { go SessionCleanupTask() // Тут? } ???
Pavel
В главной когртине обрабатывай сигналы SIGTERM, SIGKILL SIGINT, по сигналу делаешь отмену контекста и ждёшь вейтгруппу
Anonymous
То-есть насколько я понял что проблема зависания в: func init() { go SessionCleanupTask() // Тут? } ???
как вариант что ожидание выхода можно делать внутри main
Anonymous
если хочешь в рутине ожидать , туда нужно параметром отправить канал завершения то есть тот канал по которому рутина пошлет сигнал о своем завершении
Savely
ребзя, а кто что юзает из орм-ок разряда sql-first?
Savely
у меня тут сейчас прод на code-first orm-ке написан, по классике со временем не находили нужного в итоге весь код адская каша из orm и rawquery
Savely
gorm юзал, но как-то хз, не очень зашел
Евгений
как вариант что ожидание выхода можно делать внутри main
А как это делать вообще не трогая main вовсе? То-есть в рамках только самого package? Как пример - если переносить код на google сloud platform - то там вообще main не доступен, там все модули...
Евгений
Просто задача тривиально простая для модуля на любом языке программирования - запустил поток, в данном случае рутну и через каждую минуту вычищаешь из массива старые данные
Евгений
ну и проверяешь состояние процесса на предмет завершения...
Евгений
Нее os.Exit вообще не вариант...
Anonymous
сколько раз ты использовал os.Exit чтобы выйти из Golang приложения по Ctrl+C?
Daniel
И это чудовищно вымораживает. На что заменили? Zap?
Structlog. Спецом для замены логруса написали
Daniel
Anonymous
Дефолтный обработчик ctrl-c именно это и делает
да мы обсуждаем как из модуля где нет main завершить работу 😊 по Ctrl+C! Осталось понять чего
Savely
да мы обсуждаем как из модуля где нет main завершить работу 😊 по Ctrl+C! Осталось понять чего
Там мейн-то есть, просто гугл его редачить не дает, насколько я понимаю