
FRD Official - Dmitriy
18.03.2018
07:37:11
Рекомендую sqlboiler, чутка доки покурить надо конечно, но потом втянешься

Mykyta
18.03.2018
07:51:37
А gorm - ослобык, и не быстрый и не человечный
А еще на нем можно таких проблем огребсти случайно, что просто пиздц. Я его больше года использую (сейчас бы я его, конечно, не выбрал, но и не я его выбирал вначале).
Например если сделать db.Delete("users").Where("id = ?", id) то вы снесете всю таблицу юзеров, лол

?
18.03.2018
08:00:27
жесть)

FRD Official - Dmitriy
18.03.2018
08:04:17
Капец

Google

Michael
18.03.2018
08:16:31
типа чистый sql лучше?

Влад
18.03.2018
08:19:29

Yuriy
18.03.2018
08:20:09
Всем привет!
Народ, подскажите как происходит освобождение памяти и как правльно это сделать?
Есть такой код:
type SomeObject struct {
data string
}
func NewObject() *SomeObject {
obj:=&SomeObject{
data: "default value",
}
return obj
}
func main() {
var list map[int]*SomeObject
list[0]=NewObject()
log.Println(list[0].data)
delete (list,0)
}
Насколько я понимаю delete удаляет только указатель, а память остается занятой структурой. Как удалить (delocate memory) саму структуру из памяти?

Arch
18.03.2018
08:22:05

Mykyta
18.03.2018
08:22:31
Почему так?
Ну потому, что gorm сначала выполнит Delete, а потом только Where (точнее он его проигнорирует). По задумке Delete надо писать как Delete("users", "id = ?", id)

Влад
18.03.2018
08:22:44
Ахаххахах.

Yuriy
18.03.2018
08:22:53

Arch
18.03.2018
08:23:09

some_random_anonymous
18.03.2018
08:23:23

Mykyta
18.03.2018
08:23:51

Kirill
18.03.2018
08:24:01

Arch
18.03.2018
08:24:35

Kirill
18.03.2018
08:25:00

Google

Mykyta
18.03.2018
08:25:06

Yuriy
18.03.2018
08:25:19

Arch
18.03.2018
08:25:45
Особенность, потому как GC тормозит основной поток чтобы собрать мусор, что негативно отразится на реалтайм данных

Mykyta
18.03.2018
08:26:26

Kirill
18.03.2018
08:26:32

Arch
18.03.2018
08:27:12
Интересненько
те если вы будуте генерить постоянно большое число объектов, то даже при выводе в лог, сможете увидеть как GC тормозит рантайм для сбора мусора....

Alexander
18.03.2018
08:27:17

Kirill
18.03.2018
08:27:31

Alexander
18.03.2018
08:27:49

Yuriy
18.03.2018
08:27:58

Arch
18.03.2018
08:28:51

Yuriy
18.03.2018
08:30:03

Kirill
18.03.2018
08:31:21

Mykyta
18.03.2018
08:32:00

Arch
18.03.2018
08:32:20

Kirill
18.03.2018
08:32:28

Mykyta
18.03.2018
08:32:58

Kirill
18.03.2018
08:33:10

Arch
18.03.2018
08:33:10
Надеюсь GC когда - нибудь допилят чтобы он в рантайме подчищал мусор без остановки рантайма

Google

Yuriy
18.03.2018
08:34:12

Alexander
18.03.2018
08:34:34

Arch
18.03.2018
08:35:08
да, но зачем? (https://golang.org/pkg/runtime/#GC)

Yuriy
18.03.2018
08:35:49

Mykyta
18.03.2018
08:35:55

Arch
18.03.2018
08:37:16

Mykyta
18.03.2018
08:38:51

Arch
18.03.2018
08:40:28
Вот сейчас над переиспользованием структур через sync.Pool вроде
Суть в том, что после того как работа сделана, структура не удаляется, а отправляется обратно в пул, после чего ты можешь ее повторно запросить

Arch
18.03.2018
08:43:03
Но надо делать бенчи, что будет быстрее работать

Mykyta
18.03.2018
08:43:33

Arch
18.03.2018
08:43:57
Это да, надо доп метод, который будет приводить структуру в порядок
ну когда ты гоняешь миллион тяжелых структур туда - сюда обратно, это может иметь смысл
Надо пробовать, пока руки не добрались, но в голове уже поселилось

FRD Official - Dmitriy
18.03.2018
08:56:30

Michael
18.03.2018
08:57:07
не может быть)

FRD Official - Dmitriy
18.03.2018
08:58:13

Google

Michael
18.03.2018
08:59:10
а от sequel вообще скупая слеза побёгла

Yuriy
18.03.2018
09:54:15
Сложность в том, что структуру надо "очищать" после использования
?! Можете уточнить, что значит очищать?! Все поля в nil. Завершение горутин с этой структурой?!
Вопрос относительно конкретной задачи:
Использую websocket сервер. При подключении нового клиента создаётся структура, в которую передается ссылка на экземпляр клиентского коннекта.
Ссылка на экземпляр структуры добавляется в map.
При наступлении события клиентского дисконнекта я останавливаю все горутин в конкретной структуре, удаляю из map элемент со ссылкой на структуру с "отвалившимся" коонектом.
Как я понял gc позаботится об остальном и дополнительно мне ничего делать не надо.
Или не совсем так?!

Arch
18.03.2018
09:56:33

Admin
ERROR: S client not available

Arch
18.03.2018
09:57:48

Yuriy
18.03.2018
10:00:14

Arch
18.03.2018
10:00:35

Yuriy
18.03.2018
10:01:16


Mykyta
18.03.2018
10:02:24
?! Можете уточнить, что значит очищать?! Все поля в nil. Завершение горутин с этой структурой?!
Вопрос относительно конкретной задачи:
Использую websocket сервер. При подключении нового клиента создаётся структура, в которую передается ссылка на экземпляр клиентского коннекта.
Ссылка на экземпляр структуры добавляется в map.
При наступлении события клиентского дисконнекта я останавливаю все горутин в конкретной структуре, удаляю из map элемент со ссылкой на структуру с "отвалившимся" коонектом.
Как я понял gc позаботится об остальном и дополнительно мне ничего делать не надо.
Или не совсем так?!
Суть в том, что бывает, что нам очень часто нам надо создавать много объектов, например какие-то DTO-структуры или прочее и в теории их срок жизни очень маленький, но они накапливаются и висят в памяти, пока их сборщик не соберет. Для этого придумали sync.Pool, он по случаю создает новый объект либо вытаскивает уже существующий, если его не собрал сборщик, а ты объект понасиловал и сбросил обратно в пул. Так вот, после возвращения обратно в пул, у тебя у объекта остаются все старые значения свойств и если ты его снова получишь из пула, он будет замусорен старыми значениями


Savely
18.03.2018
10:03:12
Конкретно sync.Pool не доводилось юзать.

Arch
18.03.2018
10:04:54

Savely
18.03.2018
10:05:06
А бенчи вот тут есть: https://habrahabr.ru/post/338718/
Но для меня это было некритично.

Arch
18.03.2018
10:06:33
В плане писанины скорее.
» если у вас высоконагруженная (и 100нс решают) система с большим количеством ядер процессора (32+), вы можете захотеть использовать sync.Map вместо стандартного map+sync.RWMutex. В остальных случаях, sync.Map особо не нужен.
порадовало))))

Savely
18.03.2018
10:07:27


Yuriy
18.03.2018
10:10:02
Суть в том, что бывает, что нам очень часто нам надо создавать много объектов, например какие-то DTO-структуры или прочее и в теории их срок жизни очень маленький, но они накапливаются и висят в памяти, пока их сборщик не соберет. Для этого придумали sync.Pool, он по случаю создает новый объект либо вытаскивает уже существующий, если его не собрал сборщик, а ты объект понасиловал и сбросил обратно в пул. Так вот, после возвращения обратно в пул, у тебя у объекта остаются все старые значения свойств и если ты его снова получишь из пула, он будет замусорен старыми значениями
Очень доступное объяснение. Теперь все понятно. Спасибо!!

Mykyta
18.03.2018
10:10:17

Zver
18.03.2018
10:10:48

Google

Arch
18.03.2018
10:11:24
Кто-то рассказывал что синк мап хранит копию мапы, не очень хорошее решение для больших мап

FRD Official - Dmitriy
18.03.2018
10:12:08

Savely
18.03.2018
10:12:14

Arch
18.03.2018
10:13:01

Alex
18.03.2018
12:15:27
Посоны, а что делать если я итерирую по массиву но мне не нужен индекс и у меня declared and not used

Arch
18.03.2018
12:16:39
замени имя переменной на нижнее подчеркивание _

Aleksandr
18.03.2018
12:16:41
_, val := range ...

Alex
18.03.2018
12:18:57
Вы лучшие! Пошёл про это подчеркиваниие гуглить

Arch
18.03.2018
12:23:07

Alex
18.03.2018
12:23:23
Уже прочитал. Это такой /dev/null :)

Zver
18.03.2018
12:29:53

Alex
18.03.2018
12:31:38

Makkusu
18.03.2018
12:34:51
Всем привет! Подскажите как можно подобную структуру создавать или генерировать?
type Resp struct {
Key struct {
// Данные в массиве
} `json:"special_key"`
}
От сервера приходит ответ в JSON в формате
{
"special_key" : {
"data" : data
...
}
}
То есть ключ в ассоциативном массиве меняется исходя из того какой я ключ отправлю на сервер.
Как это можно реализовать?

Aleksandr
18.03.2018
12:43:26
json.RawMessage + свой анмаршаллер