@gogolang

Страница 1528 из 1630
Foxcool
10.10.2018
15:56:16
type Brand struct {...}

и append(brand, Brand{"Reebok", 4})

типа того

ну и brand уже есть []Brand https://play.golang.org/p/P6j7d7Q0_Fr

Google
Vadim
10.10.2018
15:58:27
Привет

Обновился до го 11, vscode перестал делать autocomplete

Sergey
10.10.2018
16:01:35
с GO111MODULE случайно не игрался?

Дмитрий
10.10.2018
16:01:45
ну и brand уже есть []Brand https://play.golang.org/p/P6j7d7Q0_Fr
Спасибо большое за разъяснение

Foxcool
10.10.2018
16:03:25
Спасибо большое за разъяснение
еще, если по какой-то странной причине надо анонимно структуры описывать, то можно вот так упороться https://play.golang.org/p/ypO34ltfgKJ

т.е. заново описывать спеку структуры каждый раз

но думаю, без явной нужды это может считаться плохим стилем

Daniel
10.10.2018
16:19:16
и задалбывает

tsov
10.10.2018
16:42:00
Обновился до го 11, vscode перестал делать autocomplete
там косяк в gocode, поломали обратную совместимость с хитровывернутой конструкцией. есть уже тикет в гитхабе gocode

Daniel
10.10.2018
16:42:34
а почему у меня не поломался?

вернее - он поломался, но я перекомпилял все тулзы, и он починился

vscode сам предлагает, кстати, все перекомпилять

Michael
10.10.2018
16:51:34
Там сломался автокомплит при определнных кейсах только вроде

Google
Vadim
10.10.2018
16:52:25
Там сломался автокомплит при определнных кейсах только вроде
У меня везде, но я перекомпилил и всё заработало

Антон
10.10.2018
17:28:41
Привет! Есть ли среди присутствующих кто-то, кто использует echo как основной фреймворк для написания веб-приложений?

Хотелось бы послушать советы или посмотреть может быть репозиторий со структурой проекта Имею в голове собственную структуру, но допускаю, что в силу недостатка у меня опыта, она убогая получилась

Vadim
10.10.2018
17:33:10
У меня везде, но я перекомпилил и всё заработало
Обнаружил проблему с дебагингом

Мне это всё очень не нравится

Mush
10.10.2018
17:35:58
Эхо не эхо - сути особо не меняет.

Антон
10.10.2018
17:38:58
Эхо не эхо - сути особо не меняет.
тем более) просто я пару проектов уже делал с той структурой в голове, которую придумал и так или иначе сталкивался с проблемами циклических импортов. Я, конечно, как-то проблему решал, но скорее всего возникала она из-за того, что структура проекта изначально неверно заложена была

И еще Когда приложение включает в себя какое-то АПИ, как вообще принято адекватно обрабатывать данные, которые в запросе приходят? я для каждого метода в апи создаю отдельную структуру типа 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)

выглядит как полное убожество) можно это как-то разуменее делать?

Интернет Магазин
10.10.2018
18:01:35
Вечер добрый, мужики я тут оплату через stripe делал, но появилось нужда сделать проверку по 3д секюр. Кто такое делал ? Для меня просто вообще не понятно как проверить нужна ли проверка для карты пользователя, а если нужна то откуда получить ссылку для редиректа ...

Подскажите плиз кому не труда, заранее спасибо всем

Subbotin
10.10.2018
18:22:31
выглядит как полное убожество) можно это как-то разуменее делать?
Ну можно объединить декларацию типа и создание переменной

А в остальном ничего не поменяешь осоьо

Никита
10.10.2018
20:08:31
Есть такая ситуация: мы создаем юзера, есть метод из репозитория CreateUser, который должен создавать юзера в БД. Также этому юзеру будет присвоен айди, который потом надо будет вернуть. Нормально ли будет сделать так, чтобы передавать в метод указатель на userData и тот модифицировал добавляя ему значение в поле Id, либо же делать чтобы этот метод возвращал копию структуры с дополнительным необходимым полем? userData := models.User{ FirstName: req.FirstName, LastName: req.LastName, Email: req.Email } err = controller.db.CreateUser(userData)

Marlik
10.10.2018
20:10:21
id, err = controller.db.CreateUser(userData) а так, не?

Marlik
10.10.2018
20:13:02
Хм, func (p *TutChtoto) CreateUser(userData) (id, error) { ... return id, err }

Google
Vladislav
10.10.2018
21:19:17
Только тогда нужна ссылка на userData

Marlik
10.10.2018
21:19:20
Вообще вариант записывать ID в модель User в самой функции CreateUser более симпатичный и логичный ИМХО. Сам так делаю обычно.
А смысл? Вернуть пустую структуру в которой лишь только ID? Он пишет юзера в базу, используя структуру, получить хочет его ID, ну так и нужно вернуть int и всё.

Vladislav
10.10.2018
21:20:40
Не вернуть пустую структуру, а модифицировать текущую, указав в ней ID тем самым после вставки в БД. Но я оговорился уже, что для этого уже ссылка нужна

anatolii
10.10.2018
21:21:50
Я выбрал шаблон Репозиторий, из того что вы скинули похож на него DataMapper
Просто посмотрите как с таким подходом работают в го, это популярный подход

anatolii
10.10.2018
21:24:05
Marlik
10.10.2018
21:25:00
Верни int, err из функции, не мучайся.

Marlik
10.10.2018
21:25:14
Хм, func (p *TutChtoto) CreateUser(userData) (id, error) { ... return id, err }

Никита
10.10.2018
21:26:14
Верни int, err из функции, не мучайся.
Выше писал, что такой вариант не годится, если у нас несколько полей будет меняться. В таком случае прийдется вовращать несколько переменных, как то некрасиво получается

anatolii
10.10.2018
21:26:16
А как решить саму проблему то?)
Кстати, а драйвер бд тебе не вернет результат, айди честный случай, может быть куча автополей, даты например. Так что у тебя тока айди остается возвращать, ибо все равно данных будет не хватать

Aleksandr
10.10.2018
21:26:57
А как решить саму проблему то?)
читал как это решается в ddd?

Google
Aleksandr
10.10.2018
21:30:50
решается identity generator'ом, который либо генерит id на стороне приложения (uuid) либо достает следующий id из базы. Второй вариант геморный и явно через жопу.

Marlik
10.10.2018
21:33:20
решается 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
10.10.2018
21:33:41
упс. опередили))

Тогда нужно по вашей логике отказываться от int'овых PRIMARY KEY и переходить на GUID'ы

Никита
10.10.2018
21:35:18
Ну вот в MySQL если я не ошибаюсь, ты вставляешь строку первым запросом, потом кто тоже вставляет строку сразу после тебя, и твой второй запрос на last_insert_id() вернет айди строки второго человека

Это Postgres умный и может вернуть что хочешь из вставляемой строки

Admin
ERROR: S client not available

Сергей
10.10.2018
21:36:37
Ребята, юзайте returning из базы, вы че тут придумываете??

Marlik
10.10.2018
21:44:32
я не понимаю, что тут у тебя за chatId и что ты вообще тут показываешь
Пусть будет не chatID, пусть будет firstName, это я из бота копипастнул.

Никита
10.10.2018
21:44:37
да
Я так понимаю это распространенный подход?

Aleksandr
10.10.2018
21:45:02
Пусть будет не chatID, пусть будет firstName, это я из бота копипастнул.
давай у нас репозиторий будет работать с User, а не firstName

Marlik
10.10.2018
21:46:06
Ну окей, что меняет-то? Вернуть из базы id последней записи проще же, не?

Единственный косяк который я вижу, это что int закончится.

Aleksandr
10.10.2018
21:47:17
Ну окей, что меняет-то? Вернуть из базы id последней записи проще же, не?
репозиторий - это интерфейс к хранилищу. Не к базе. Хранилище может быть без автоинкрементных id.

меняем реализацию репозитория и наш код перестает работать, потому что id не возвращается

Google
Сергей
10.10.2018
21:48:42
Единственный косяк который я вижу, это что int закончится.
Сомневаюсь, что у вас такие объемы, что он закончится

Marlik
10.10.2018
21:49:19
Ну, мало-ли, делит, инсёрт частый.

Aleksandr
10.10.2018
21:49:21
то что ты предлагаешь - это называется "текут абстракции". Ты репозиторий реализуешь так, как будто бы знаешь что он будет mysql

а должен реализовывать так, как будто там может быть что угодно

поэтому мы можем просто UserStore сделать как предлагаешь ты например. Либо репозиторий

Marlik
10.10.2018
21:52:03
Не, я делаю через модель, переписать только запросы в базу и всё. Вот по такой схеме https://habr.com/post/329582/

Kirill
10.10.2018
21:54:05


Илья
10.10.2018
22:25:22
Почувствовал себя насильником? :-D

Kirill
10.10.2018
22:26:20
Почувствовал себя насильником? :-D
Более того, это мне моя девушка скинула. Которая в БГУИРе учится

Alexander
10.10.2018
22:27:09
насильница какая!

Илья
10.10.2018
22:28:12
Программист теоретик, горе в семье

Откуда у них эти «шуточки»

Alexander
10.10.2018
22:28:53
Внизу доска, а сверху - "презентация"... Вобще, кажется, что материал лучше усваивается, если лектор это прямо тут же далает все на доске! Но так сложней готовиться к лекции, для лектора :(

Евгений
11.10.2018
02:34:29
Товарищи не подскажите как кильнуть 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() }

Alexander
11.10.2018
02:35:09
никак

если ты уже кого-то загнал в sleep - он будет спать, пока время не пройдет

Евгений
11.10.2018
02:36:13
А альтернативый способ сделать background таск с выполнением по времени или до сигнала?

Alexander
11.10.2018
02:37:00
или до таймаута в switch

Страница 1528 из 1630