@proGO

Страница 980 из 1674
Александр
09.11.2017
09:58:48
С классами можно нормально структурировать всё и изолировать код

Mykyta
09.11.2017
09:58:56
Еще eval() не хватает, ага

Sheldon
09.11.2017
09:59:06
Kirill
09.11.2017
09:59:13
Го++, а потом кое-какая компания подпирает костыли, делая их ++ #, и нахер такое даже даром

Google
Kirill
09.11.2017
10:00:03
Учи гошку. Научишься писать на го - поймёшь, почему тут нет классов.

Arch
09.11.2017
10:00:03
Го++, а потом кое-какая компания подпирает костыли, делая их ++ #, и нахер такое даже даром
Заметьте - это ваши не обоснованные догадки, мы говорили только про классы и наследование

Kirill
09.11.2017
10:00:20
Блин

Ну ребята

Следите за руками

Blue Screen of Death
09.11.2017
10:00:36
"яхочучтобыкаквджаве"

Kirill
09.11.2017
10:00:46
Предположим, Гошка - новый си

Ну - предположим

Vladimir
09.11.2017
10:01:07
да забаньте тролей

делов то

Konstantins
09.11.2017
10:01:14
будет занятно, если все это добавят, ведь именно за эти вещи Го и хвалят его создатели)

Kirill
09.11.2017
10:01:15
Добавили классы в си - сделали ц++

Vladimir
09.11.2017
10:01:16
тут каждый день набегают такие

Google
Blue Screen of Death
09.11.2017
10:01:25
ребята, когда в фасм классы завезут? я хочу структурировать код

Kirill
09.11.2017
10:01:28
Подперли костыли - сделали с#

Vladimir
09.11.2017
10:01:52
@schors @onokonem спасите чат от затроллевания

Kirill
09.11.2017
10:01:52
да забаньте тролей
У меня банхаммера в этом чате нет

Mykyta
09.11.2017
10:03:01
В го не хватает мощи у const.

Vladimir
09.11.2017
10:03:12
чокаво?
я про тех товарищей что опять пришли топить за классы и прочее вот всякое

Mykyta
09.11.2017
10:03:19
Переменную уровня пакета нельзя сделать readonly

Igor
09.11.2017
10:03:28
Vladimir
09.11.2017
10:03:51
это кирилл ща лучше скажет (ИМХО)

я тред просто не читал, так что лучше юзернеймы
но ты ж тоже без банхаммера тут, не?

Daniel
09.11.2017
10:04:25
Так, поименно, кого?

Igor
09.11.2017
10:04:26


Mykyta
09.11.2017
10:04:35
const могут быть только строки, инты, а структуры, интерфейсы, мапы и слайсы - нет

Vladimir
09.11.2017
10:05:22
Kirill
09.11.2017
10:05:47
но ты ж тоже без банхаммера тут, не?
Тут полчата с банхаммером, мне тут исторически не хотят давать инструменты диктатуры

Vladimir
09.11.2017
10:05:49
майк вроде опять

Kirill
09.11.2017
10:06:29
Google
Daniel
09.11.2017
10:07:02
Обоим сутки ro прописал

Александр
09.11.2017
10:07:26
Меня то за что

Vladimir
09.11.2017
10:07:39
[2]
он вроде просто сказал про классы когда уже срач начался

Daniel
09.11.2017
10:08:13
Я тут бытом занят, но всегда готов

Пишите только, кого прибить

Igor
09.11.2017
10:08:30
я тоже работу работаю обычно, но можно пинговать)

Ilia
09.11.2017
10:27:23
Mykyta
09.11.2017
10:29:01
Да, только документации по нему нет, все приходится методом тыка разбираться. Я даже книгу покупал, т.к. в интернете нет информации, что в ней. Все по крупинкам надо выковыривать

Могу скинуть книгу, если нужно

Ilia
09.11.2017
10:32:28
Могу скинуть книгу, если нужно
да я бы почитал. это вообще не мой профиль, но давно хочу свою АТСку сделать… для внутреннего пользования. и очень не хочу брать asterisk

Mykyta
09.11.2017
10:33:18
Сип и интернет-телефония - это такой адок, я бы добровольно не связывался)

Ilia
09.11.2017
10:34:38
ну я из интереса. будет больно - брошу

Дмитрий
09.11.2017
10:40:50
Коллеги, я - новичёк в Go. Тупой вопрос. Кто-то работал с GORM+Gin? Проблема такая: Добавил BeforeSaveCallback на обновление\создание юзверей. В нём получаю хэш пароля и сохраняю в базёнку (Postgres). Проблема в том, что на метод UpdateUserHandler( хандлер Gin) сваливаются JSON не со всеми полями структуры User. Иногда пароль приходит, иногда нет. Суть проблемы в том, что из-за коллбэка Пароль у юзеров постоянно обновляется, т.к. в нём(коллбэке) не стоит проверки на previous данные. Вопрос, как после BindJSON(&user) в хандлере Gin'a или в коллбеке получить прошлую версию структуры? Хочется что-то типа ActiveModel::Dirty в Rails

Может кто-то помочь?

Mykyta
09.11.2017
10:42:10
Не используй колбеки, сразу говорю

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

Я использую горм, но чисто как билдер запроса и байндер результата в структуру, все остальное - зло

Google
V
09.11.2017
10:52:00
если тебе нужен апдейт сущности, получай поля, которые надо изменить и вручную их меняй
А как быть если мы хотим сделать апдейт записи через json, в которой уже есть пароль md5, но в json пароль не передаем и он делает md5 от md5, потом что используем gin.Context.BindJson(модель), и не можем ручками вычленить аттрибут json?

Дмитрий
09.11.2017
10:52:17
Спасибо за ответ. Я, конечно, склонялся к такому, но как-то не кошерно получается. Я понимаю, что технологию новая, но всё же. Про коллбеки - согласен, но не хотел писать логику моделей в хандлерах. Может мне надо перестать думать как ООП'шник? ?

Mykyta
09.11.2017
10:54:43
Дмитрий ну вынеси всю логику в какой-то UserService, получается, что ты размазываешь логику работы с данными и непонятно где, когда, куда и почему-то что-то приходит и куда девается.

Дмитрий
09.11.2017
10:55:42
Ещё более глупый вопрос ? А если таких полей штук 40? По каким-либо историческим причинам? Что ты тогда предпринимать будешь? Тоже руками? Или какая-то БиблиотекаПолезныхУтилит есть в Go?

Admin
ERROR: S client not available

Mykyta
09.11.2017
10:56:16
Про то, как мд5 от мд5 берется - я тут вообще не въехал, честно

V
09.11.2017
10:58:22
Про то, как мд5 от мд5 берется - я тут вообще не въехал, честно
Наверное проще код будет показать, если удобно

Дмитрий
09.11.2017
10:58:33
Да, сейчас покажем)

func (h *Handler) UpdateUser(c *gin.Context) { var err error id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } user, err := h.UserService.User(id) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } if err := c.BindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } err = h.UserService.SaveUser(user) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": user}) }

Это Хандлер, наверное лучше ссылкой отправить, нежели тут?)

Mykyta
09.11.2017
11:01:15
Дмитрий , вообще практика показывает, что пытаться создавать универсальные модели для базы данных, запросов и ответов - плохая затея. Потому, что быстро выясняется, что для фронта какие-то поля нельзя отдавать, при обновлении надо над другими полями какие-то манипуляции проводить

Дмитрий
09.11.2017
11:02:52
А вот и наша модель с коллбеком

type User struct { gorm.Model State string `json:"state" sql:"DEFAULT:'not_activated'"` Email string `valid:"required" json:"email"` Password string `json:"password"` PhoneNumber string `valid:"required" json:"phonenumber"` LimitDate time.Time `json:"limitdate"` Comment string `json:"comment"` Role string `json:"role" sql:"DEFAULT:'specialist'"` CompanyID uint `json:"companyID"` } func (user *User) BeforeSave(scope *gorm.Scope) (err error) { if pw, err := bcrypt.GenerateFromPassword([]byte(user.Password), 0); err == nil { scope.SetColumn("password", string(pw)) } return }

@mykytanikitenko Согласен, но, как я сказал, я в этой технологии - новичёк) Я привык на Rails создавать кучу абстракций, вот и сюда попытылся перенести это мышление

Mykyta
09.11.2017
11:04:55
создаете структуру UpdateUserRequest, в которой есть только поля, которые приходят с фронтенда, к ней и байндите жсон

V
09.11.2017
11:05:55
создаете структуру UpdateUserRequest, в которой есть только поля, которые приходят с фронтенда, к ней и байндите жсон
func (h *Handler) UpdateUser(c *gin.Context) { var err error dirtyUser := models.User{} id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } user, err := h.UserService.User(id) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } if err := c.BindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } c.BindJSON(&dirtyUser) if dirtyUser.Password != "" { user.Password = h.UserService.GetMD5Hash(dirtyUser.Password) } err = h.UserService.SaveUser(user) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"status": http.StatusBadRequest, "error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"status": http.StatusOK, "data": user}) }

Дмитрий
09.11.2017
11:07:03
Повторюсь, а что делать, если вдруг таких полей будет ну очень много?

Понятно, что это не очень хорошо, но мой опыт говорит, что такое возможно, что ты делаешь в таком случае?

Mykyta
09.11.2017
11:10:36
Дело в том, что вы вручную вытаскиваете параметры, парсите их в инт - это дичь, честно

Google
Mykyta
09.11.2017
11:16:08
Вот так выглядит контроллер с большим количеством параметров у меня

https://pastebin.com/zj7qdqXD

Пришлось накостылять целый мвц-фреймворк, который получает параметры, байндит их к структуре, потом из контроллера дерает нужные методы, потом байндит результат из бд к вью-модели

Дмитрий
09.11.2017
11:22:54
Круть, в опенсурс планируешь выкидывать?

Mykyta
09.11.2017
11:25:09
Да там сильно завязано на моем проекте, выносить его как отдельную либо напряжно, не говоря уже о том, что делалось на скорую руку и надо бы порефакторить

Дмитрий
09.11.2017
11:27:49
Ну ладно( Если не сложно, можешь хоть немного приподнять занавес архитектуры твоего костыля? Реально, ведь, интересно! Выглядит как декларативный синтаксис более-менее.

Mykyta
09.11.2017
11:31:34
Ну там внутри тонна кода на рефлексии)

В качестве хттп-сервера я использую labstack/echo, но нигде в коде с контроллером напрямую к контексту хендлера не обращаюсь

Ilia
09.11.2017
11:34:42
создаете структуру UpdateUserRequest, в которой есть только поля, которые приходят с фронтенда, к ней и байндите жсон
вы в таких случаях обычно структуру где определяете внутри хэндлера анонимную, или держите какой нить models.go ?

Mykyta
09.11.2017
11:35:51
лучше, конечно, публичную структуру, мне кажется

Ilia
09.11.2017
11:38:06
ну я и такие и такие юзаю… и пока не пришел к тому что какой то из подходов лучше. где то удобнее публичную, а где то наоборот лучше анонимную чтобы код не захламлять

вот и хотел услышать доводы какие нибудь за/против

Mykyta
09.11.2017
11:42:01
Ну надо смотреть конкретно в код. Должно быть понятно, откуда данные берутся в какой-то структуре и куда они деваются, чтобы сохранялась линейность логики обработки данных. Это то, почему я сразу против коллбеков\хуков в горме.

ros
09.11.2017
11:42:27
оффтоп. freeswitch говорят хорошая штука?
под него на Go писать можно https://github.com/fiorix/go-eventsocket

Mykyta
09.11.2017
11:44:17
@rostel именно этой либой

Страница 980 из 1674