
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

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

Daniel
10.10.2018
16:42:34
а почему у меня не поломался?
вернее - он поломался, но я перекомпилял все тулзы, и он починился
vscode сам предлагает, кстати, все перекомпилять

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

Google

Vadim
10.10.2018
16:52:25

Marlik
10.10.2018
17:06:53

Антон
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
18:54:58

Никита
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) а так, не?

Никита
10.10.2018
20:10:55

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

Google

anatolii
10.10.2018
21:11:17

Vladislav
10.10.2018
21:17:20

Никита
10.10.2018
21:18:37

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

Marlik
10.10.2018
21:19:20

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

anatolii
10.10.2018
21:21:50

Aleksandr
10.10.2018
21:22:38

Никита
10.10.2018
21:22:58

anatolii
10.10.2018
21:24:05

Никита
10.10.2018
21:24:11

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

Marlik
10.10.2018
21:26:38

Aleksandr
10.10.2018
21:26:57

Никита
10.10.2018
21:27:50

Google

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

Marlik
10.10.2018
21:33:20

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 из базы, вы че тут придумываете??

Никита
10.10.2018
21:36:56

Aleksandr
10.10.2018
21:43:08

Marlik
10.10.2018
21:44:32

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

Aleksandr
10.10.2018
21:45:02

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

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

Google

Сергей
10.10.2018
21:48:42

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

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