
ros
10.05.2017
06:34:53
type AutoGenerated []struct {
Test1 struct {
Test1K1 string `yaml:"test1_k1"`
Test1K2 string `yaml:"test1_k2"`
} `yaml:"test1,omitempty"`
Test2 struct {
Test2K1 string `yaml:"test2_k1"`
Test2K2 string `yaml:"test2_k2"`
} `yaml:"test2,omitempty"`
}

Konstantin
10.05.2017
06:35:27
Может не совсем точно описал задачу. Если заранее не известны значения test1 и test2? Известна только их структура. Т.е. например в другой раз придет такой yaml:
---
- test3:
k1: val1
k2: val2
- test4:
k1: val1
k2: val2

Aleksandr
10.05.2017
06:36:29
как можно описать структуру если ее нет?

Google

Konstantin
10.05.2017
06:38:05
Ясно, спасибо! Пошел писать свой Unmarshal )))


Aleksandr
10.05.2017
06:39:24
Ясно, спасибо! Пошел писать свой Unmarshal )))
func (user *User) UnmarshalJSON(data []byte) error {
var raw map[string]interface{}
json.Unmarshal(data, &raw)
user.Email = raw["email"].(string)
user.Nickname = raw["nickname"].(string)
user.Hash = raw["hash"].(string)
rawData := raw["data"].(map[string]interface{})
if myLeagues, ok := rawData["myLeagues"]; ok {
for _, myLeaguesMap := range myLeagues.(map[string]interface{}) {
for key, _ := range myLeaguesMap.(map[string]interface{}) {
if key != "used" {
keyParts := strings.Split(key, "_")
sportId, _ := strconv.Atoi(keyParts[0])
countryId, _ := strconv.Atoi(keyParts[1])
user.Leagues = append(user.Leagues, &League{
Id: keyParts[2],
SportId: sportId,
CountryId: countryId,
})
}
}
}
}
if myGames, ok := rawData["mygames"]; ok {
for _, myGamesMap := range myGames.(map[string]interface{}) {
for key, _ := range myGamesMap.(map[string]interface{}) {
if key != "used" {
user.GamesIds = append(user.GamesIds, key)
}
}
}
}
return nil
}
типа такого
ой, большой экран


Konstantin
10.05.2017
06:41:14
func (user *User) UnmarshalJSON(data []byte) error {
var raw map[string]interface{}
json.Unmarshal(data, &raw)
user.Email = raw["email"].(string)
user.Nickname = raw["nickname"].(string)
user.Hash = raw["hash"].(string)
rawData := raw["data"].(map[string]interface{})
if myLeagues, ok := rawData["myLeagues"]; ok {
for _, myLeaguesMap := range myLeagues.(map[string]interface{}) {
for key, _ := range myLeaguesMap.(map[string]interface{}) {
if key != "used" {
keyParts := strings.Split(key, "_")
sportId, _ := strconv.Atoi(keyParts[0])
countryId, _ := strconv.Atoi(keyParts[1])
user.Leagues = append(user.Leagues, &League{
Id: keyParts[2],
SportId: sportId,
CountryId: countryId,
})
}
}
}
}
if myGames, ok := rawData["mygames"]; ok {
for _, myGamesMap := range myGames.(map[string]interface{}) {
for key, _ := range myGamesMap.(map[string]interface{}) {
if key != "used" {
user.GamesIds = append(user.GamesIds, key)
}
}
}
}
return nil
}
типа такого
Спасибо, наглядный пример!
Вот как получилось:
var parseYaml []map[string]struct{
K1 string `yaml:"k1"`
K2 string `yaml:"k2"`
}
...
err := yaml.Unmarshal(file, &parseYaml)
...
Не пришлось писать свой.


Aleksandr
10.05.2017
06:54:05
так ты же написал, что у тебя разная структура может быть. посомтри на твои два примера

Konstantin
10.05.2017
06:56:06
Не я изначатьно не правильно описал, после исправился, что структура одна, а вот ключи родмтельские -разные.

Alyona
10.05.2017
13:33:39
Привет всем!
Направление разработки индустриального интернета вещей ищет разработчиков Rust\Go.
Работа в офисе на м. Павелецкая.
Для опытных разработчиков з/п 200+ т.р.
Технические скилы:
• Отличные знания TCP/IP стека
• Отличные знания Go или Rust
• Опыт работы с high load системами
Будет огромным плюсом:
• Опыт построение приложений, которые держат сотни тысяч постоянных коннектов
• Опыт разработки стораджей или баз данных
• Понимание CAP
• Живые проекты на github
#вакансия #москва #backend #go #rust

Mike
10.05.2017
13:34:49
third time is a charm?

Мерлин
10.05.2017
13:38:23

Mike
10.05.2017
13:38:37
эх, пропустил

⠀
10.05.2017
14:30:45

Google

Мерлин
10.05.2017
18:06:56
http://golangshow.com/episode/2017/05-03-099/

Илья
10.05.2017
18:24:53
прям пятничный наброс
https://github.com/golang/go/issues/20165

kyprizel
10.05.2017
20:34:24
нужно хранить два персистентных независимых счетчика uint32 - что лучше заиспользовать, чтобы было минимум зависимостей, но при этом макс. надежность по потере данных ? нагрузка минимальная. писать свою запись на диск в файлики с блокировками не хочется

corpix
10.05.2017
20:55:25

Quet
10.05.2017
21:04:09
левел это не "меньше"
болт норм для такого

kyprizel
10.05.2017
21:07:29
thanks

Andrey
10.05.2017
21:08:46
Редиска умеет в inc, далее вопрос надежности репликации

kyprizel
10.05.2017
21:16:02
embeded device)
но я уже посмотрел - проще в файлик сбрасывать

Andrey
10.05.2017
21:17:53
Ну ембедед решает этот вопрос энергонезависимой памятью

Ilya
10.05.2017
21:24:27
Тарантул еще, но если нужны просто 2 циферки, то может проще и самому в файл

Andrey
11.05.2017
00:22:09
Баньте бота

Кирилл
11.05.2017
04:56:57
Привет. Подскажите когда юзаешь go get, нормально что сразу может не загрузить репо?

Mars
11.05.2017
05:21:58
@FZambia, есть возможность встроить centrifugo в свой веб сервер?

Alexandr
11.05.2017
05:54:55
@olebedev привет, ты имеешь в виду из Go воспользоваться Centrifugo как библиотекой и поднять ее на своих роутах?

Mars
11.05.2017
05:58:43

Alexandr
11.05.2017
06:02:27
Ну вообще так не задумывалось, но вот тут точка в хода - https://github.com/centrifugal/centrifugo/blob/master/libcentrifugo/centrifugo/main.go#L248 - передается список серверов и у сервера должны быть методы Run() и Shutdown() - но так пока никто не делал, сложно с ходу сказать, чем все обернется)

ainu
11.05.2017
06:10:03

Google

ainu
11.05.2017
06:10:40
Потому что если возможно не как standalone бинарник, было бы круто

Alexandr
11.05.2017
06:10:55
А вот так чтобы просто заимпортировать обработчики и повесить их на свой роутер - это реально скорее всего, но нужно будет по кирпичикам с нуля строить - не тривиально
слишком много stateful логики внутри

Mars
11.05.2017
06:11:39

Alexandr
11.05.2017
06:14:50
Да, я думал об этом - даже есть интерфейс который можно передать ноде на старте для обработки событий от клиентов (https://github.com/centrifugal/centrifugo/blob/master/libcentrifugo/node/mediator.go) - но это достаточно сложно вынести в удобный API, так что так и осталось в зачаточном состоянии.
Если у кого есть use case - можно попробовать поработать над этим, в общем-то в связке с Redis-ом даже что-то масштабируемое получится

Mars
11.05.2017
06:23:38
Видимо проще поднять контейнер и забыть )

Alexandr
11.05.2017
06:24:27
Если нагрузка небольшая, то наверное действительно проще просто отдельно поднять

Mars
11.05.2017
06:24:48

Alexandr
11.05.2017
06:26:48
ну думай об этом как о микросервисах))) На самом деле я сейчас сам делаю проект у которого веб-морда - это SPA - а на бекенде у нее Django + Задачи в Crond + Celery, меня так раздражает что для простой вещи я должен делать 3 отдельных процесса, что вот планирую переписывать на Go

Mars
11.05.2017
06:28:38

Alexandr
11.05.2017
06:33:07
ну да.. нужно будет подумать на тем чтобы сделать простую интеграцию с кодом в Centrifugo

Mars
11.05.2017
06:33:57
Но если сделать из Centrifugo библиотеку, это будет очень здорово
Классный проект

Alexandr
11.05.2017
06:35:33
Да вроде не много, все основное внутри Node сосредоточено, но это точно будет не просто

ros
11.05.2017
07:40:26
мапы не высвобождают память после удаления элементов.
знать бы про это года полтора назад.
весь мозг уже свернул куда память съедается.

Ivahaev
11.05.2017
07:42:35

Mars
11.05.2017
07:43:09

Google

Ivahaev
11.05.2017
07:43:40
Прочие равные могут быть совершенно разными :)

Mars
11.05.2017
08:02:46
Равные могут быть разными, ок

Andrew
11.05.2017
08:26:22

ros
11.05.2017
08:33:58

Andrew
11.05.2017
08:35:18

ros
11.05.2017
08:35:53
печально что с этим ничего делать пока не собираются https://github.com/golang/go/issues/20135

Eduard
11.05.2017
08:37:19
Тогда как освободить памятт

ros
11.05.2017
08:37:45
проблема врожденная, но блин хоть где-нибудь бы было озвучено
как освободить написал выше
реалокацией только
case <-mapReAllocate:
// проблема в том что map не освобождают память
// соответственно требуется полная реалокация
// https://github.com/golang/go/issues/20135
tmpServersControl := ServersControl
ServersControl = make(map[string]*data.TServerControl)
for k, v := range tmpServersControl {
ServersControl[k] = v
}
tmpViewers := Viewers
Viewers = make(map[string]*data.TViewer)
for k, v := range tmpViewers {
Viewers[k] = v
}
}
может и без рекурсии можно ХЗ, но пока так работает
на паре сотне тысяч элементов пробегает быстро
вот так плавно ело
приходилось перезапускать демона раз в 3-4 недели
без рекурсии обычным присвоением скорей всего не обойтись, ибо map - указатель

Ivahaev
11.05.2017
09:14:21
Я не совсем понял, не чистятся ссылки на элементы мапы, или только сами бакеты не сжимаются?

ros
11.05.2017
09:16:53
из примера кода выше
в ServersControl и Viewers постоянно добаляется и удаляется несколько тысяч элементов
общее количество элементов остается примерно на одном уровне
если ничего не предпринимать память выделяемая под эти map-ы будет постоянно расти

Maxim
11.05.2017
12:32:16
тяжело представить, почему в таком случае ссылки могут не чиститься

Ivahaev
11.05.2017
13:01:04
Ну и не страшно, стало быть. Разве что, если была мапа с миллионом элементов, а осталось два и больше не предвидится.

Google

Maxim
11.05.2017
13:02:37

ros
11.05.2017
13:04:51
пока существует map он может только расти
похрену живые в нем элементы или нет
хоть все удали через delete
все-равно GC не соберется

Ivahaev
11.05.2017
13:07:21
А что должен GC собрать? Мапа-то сама жива.
Набрал ты 10 элементов, все удалил, вставил другие 10.
Размер остался тот же.

ros
11.05.2017
13:08:31
ну ссылки на удаленные элементы из неё не удаляются

Ivahaev
11.05.2017
13:09:07
А, т.е. удалённые элементы не чистятся?

ros
11.05.2017
13:09:11
т.е. как при 20
да

Maxim
11.05.2017
13:14:00
хотя