
Александр
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

Igor
09.11.2017
10:02:04

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

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

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

Kirill
09.11.2017
10:03:27

Igor
09.11.2017
10:03:28

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

Igor
09.11.2017
10:04:25

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

Igor
09.11.2017
10:07:00

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

Kirill
09.11.2017
10:07:09

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

Igor
09.11.2017
10:07:38

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

Дмитрий
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 берется - я тут вообще не въехал, честно

Дмитрий
09.11.2017
10:57:41

V
09.11.2017
10:58:22

Дмитрий
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

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

Ilia
09.11.2017
11:43:17

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