Daniel
https://godoc.org/go.uber.org/zap#L
ну и в main что-то такое func prepareLogger(level string) { loggerConfig := zap.NewProductionConfig() err := loggerConfig.Level.UnmarshalText([]byte(level)) if err != nil { panic(err) } logger, err := loggerConfig.Build() if err != nil { panic(err) } zap.ReplaceGlobals(logger) }
Eugenii
я так понял, что разные уровни логов в разные файлы писать, можно только разными инстанцами а так как это требование, то может по этому отсеклось
Daniel
в реальности 12 факторов таки рулят
Daniel
а там прямо сказано - писать логи в файлы должен супервизор
Foxcool
я так понимаю, есть еще какие-то централизованные сборщики логов. Типа выводишь логи в JSON. А он их берет из контенера и все это можно посмотреть потом на сервисе логагрегатора
Foxcool
с каикм-то анализом по полям и т.п.
Eugenii
особенность культурного наследия нации
Дмитрий
Всем добрый вечер, подскажите плиз. Есть []struct{a string b int} нужно добавить в структуру данные через append не получается... как можно реализовать добавление данных?
Aleksandr
как пробуешь?
Aleksandr
какая ошибка?
Foxcool
ну в структуру данные и не аппендят
Aleksandr
у него слайс
Foxcool
а записыват в поля конкретные
Foxcool
аа
Foxcool
тьфу
Foxcool
тога да, увидеть, что аппендит
Дмитрий
https://play.golang.org/p/-gayCAtJn62
Aleksandr
так у тебя слайс структур
Foxcool
эм
Foxcool
структуру опиши сначала как тип отдельный
Foxcool
type Brand struct {...}
Foxcool
и append(brand, Brand{"Reebok", 4})
Foxcool
типа того
Foxcool
ну и brand уже есть []Brand https://play.golang.org/p/P6j7d7Q0_Fr
Vadim
Привет
Vadim
Обновился до го 11, vscode перестал делать autocomplete
Sergey
с GO111MODULE случайно не игрался?
Дмитрий
ну и brand уже есть []Brand https://play.golang.org/p/P6j7d7Q0_Fr
Спасибо большое за разъяснение
Foxcool
Спасибо большое за разъяснение
еще, если по какой-то странной причине надо анонимно структуры описывать, то можно вот так упороться https://play.golang.org/p/ypO34ltfgKJ
Foxcool
т.е. заново описывать спеку структуры каждый раз
Foxcool
но думаю, без явной нужды это может считаться плохим стилем
Daniel
и задалбывает
Roman
Обновился до го 11, vscode перестал делать autocomplete
там косяк в gocode, поломали обратную совместимость с хитровывернутой конструкцией. есть уже тикет в гитхабе gocode
Daniel
а почему у меня не поломался?
Daniel
вернее - он поломался, но я перекомпилял все тулзы, и он починился
Daniel
vscode сам предлагает, кстати, все перекомпилять
Michael
Там сломался автокомплит при определнных кейсах только вроде
Vadim
Там сломался автокомплит при определнных кейсах только вроде
У меня везде, но я перекомпилил и всё заработало
Anton
Привет! Есть ли среди присутствующих кто-то, кто использует echo как основной фреймворк для написания веб-приложений?
Anton
Хотелось бы послушать советы или посмотреть может быть репозиторий со структурой проекта Имею в голове собственную структуру, но допускаю, что в силу недостатка у меня опыта, она убогая получилась
Vadim
У меня везде, но я перекомпилил и всё заработало
Обнаружил проблему с дебагингом
Vadim
Мне это всё очень не нравится
Anonymous
Эхо не эхо - сути особо не меняет.
Anton
Эхо не эхо - сути особо не меняет.
тем более) просто я пару проектов уже делал с той структурой в голове, которую придумал и так или иначе сталкивался с проблемами циклических импортов. Я, конечно, как-то проблему решал, но скорее всего возникала она из-за того, что структура проекта изначально неверно заложена была
Anton
И еще Когда приложение включает в себя какое-то АПИ, как вообще принято адекватно обрабатывать данные, которые в запросе приходят? я для каждого метода в апи создаю отдельную структуру типа type loginRequestBody struct { Login string `json:"login"` Password string `json:"password"` } После этого я получаю данные из запроса в эту структуру и передаю на обработку примерно так: data := new(loginRequestBody) if err := c.Bind(u); err != nil { return err } result := UserController.Login(data.Email, data.Password)
Anton
выглядит как полное убожество) можно это как-то разуменее делать?
Veaceslav
Вечер добрый, мужики я тут оплату через stripe делал, но появилось нужда сделать проверку по 3д секюр. Кто такое делал ? Для меня просто вообще не понятно как проверить нужна ли проверка для карты пользователя, а если нужна то откуда получить ссылку для редиректа ...
Veaceslav
Подскажите плиз кому не труда, заранее спасибо всем
Subbotin
выглядит как полное убожество) можно это как-то разуменее делать?
Ну можно объединить декларацию типа и создание переменной
Subbotin
А в остальном ничего не поменяешь осоьо
.
Есть такая ситуация: мы создаем юзера, есть метод из репозитория CreateUser, который должен создавать юзера в БД. Также этому юзеру будет присвоен айди, который потом надо будет вернуть. Нормально ли будет сделать так, чтобы передавать в метод указатель на userData и тот модифицировал добавляя ему значение в поле Id, либо же делать чтобы этот метод возвращал копию структуры с дополнительным необходимым полем? userData := models.User{ FirstName: req.FirstName, LastName: req.LastName, Email: req.Email } err = controller.db.CreateUser(userData)
🎉
id, err = controller.db.CreateUser(userData) а так, не?
.
id, err = controller.db.CreateUser(userData) а так, не?
Ну а если допустим он не одно поле должен добавить, а несколько? Такой вариант вряд ли подойдет
🎉
Хм, func (p *TutChtoto) CreateUser(userData) (id, error) { ... return id, err }
.
Я выбрал шаблон Репозиторий, из того что вы скинули похож на него DataMapper
Vladislav
Только тогда нужна ссылка на userData
🎉
Вообще вариант записывать ID в модель User в самой функции CreateUser более симпатичный и логичный ИМХО. Сам так делаю обычно.
А смысл? Вернуть пустую структуру в которой лишь только ID? Он пишет юзера в базу, используя структуру, получить хочет его ID, ну так и нужно вернуть int и всё.
Vladislav
Не вернуть пустую структуру, а модифицировать текущую, указав в ней ID тем самым после вставки в БД. Но я оговорился уже, что для этого уже ссылка нужна
🎉
Верни int, err из функции, не мучайся.
🎉
Хм, func (p *TutChtoto) CreateUser(userData) (id, error) { ... return id, err }
.
Верни int, err из функции, не мучайся.
Выше писал, что такой вариант не годится, если у нас несколько полей будет меняться. В таком случае прийдется вовращать несколько переменных, как то некрасиво получается
Aleksandr
А как решить саму проблему то?)
читал как это решается в ddd?
.
читал как это решается в ddd?
Нет, буду рад если поделишься ресурсом
.
По сути да
.
В смысле меняться?
Мыслями немного не туда повело, забей)
Aleksandr
решается identity generator'ом, который либо генерит id на стороне приложения (uuid) либо достает следующий id из базы. Второй вариант геморный и явно через жопу.
🎉
решается identity generator'ом, который либо генерит id на стороне приложения (uuid) либо достает следующий id из базы. Второй вариант геморный и явно через жопу.
Почему? // InsertUser ... func (p *Handler) InsertUser(ChatID int64) (int, error) { var lastInsertID int t := time.Now() err := p.dbConn.QueryRow(`INSERT INTO users (chat_id, dt) VALUES($1,$2) RETURNING id;`, &ChatID, &t).Scan(&lastInsertID) if err != nil { log.Fatal(err) } return lastInsertID, nil }
Vladislav
упс. опередили))
Vladislav
Тогда нужно по вашей логике отказываться от int'овых PRIMARY KEY и переходить на GUID'ы