@proGO

Страница 585 из 1674
Sander
03.04.2017
22:15:45
хпх

так что пхп так крут? или нет

Alexey
03.04.2017
22:18:06
так что пхп так крут? или нет
Там есть дженерики? Он web-scale?

Kirill
03.04.2017
22:18:55
Там есть дженерики? Он web-scale?
он динамически типизированный.

Google
Serge
03.04.2017
23:39:37
привет, а вот и я с дженериками;) а есть уже что-то написанное, чтобы сделать Unmarshal на interface{} и получить известный мне struct?

LexsZero
03.04.2017
23:42:56
ыыыы

я два раза решал эту проблему разными способами

Serge
03.04.2017
23:43:48
ну ведь логично же просто сделать то же, что в парсерах json и yaml делают, не?

LexsZero
03.04.2017
23:43:54
только не на interface{}, а на один из типов реализующих известный интерфейс

шо?

а, я другую проблему решал.

сорри

Serge
03.04.2017
23:44:16
ну блин, есть мой struct a, есть interface{} b я хочу b := interface{}{...} var a struct { ... } err := magic.Unmarshal(&b, &a) fmt.Printf("%+v", a)

LexsZero
03.04.2017
23:44:45
маршалишь в жсон и анмаршалишь в структуру ?

Constantine
03.04.2017
23:45:49
я последнее тоже практиковал :D

LexsZero
03.04.2017
23:45:50
вообще там 30 строчек ебли в рефлект, но мне готового не попадалось

Serge
03.04.2017
23:48:00
ну вот я хочу, чтобы не просто 30 строчек, а со всякими мульками, типа интерфейса Unmarshaler и все такое

Google
LexsZero
03.04.2017
23:48:08
а как так вышло что у тебя есть interface{} и известная структура, и при этом это не одно и то же и надо совершать какие-то сложные телодвижения?

Serge
03.04.2017
23:49:17
а как так вышло что у тебя есть interface{} и известная структура, и при этом это не одно и то же и надо совершать какие-то сложные телодвижения?
возможно, я что-то делаю не так у меня есть yaml с полем, имя которого определяет структуру, которую я буду использовать

LexsZero
03.04.2017
23:49:37
так тебе зависимые типы нужны

!

а в го их нету, так что начинаются костыли

Serge
03.04.2017
23:50:05
спасибо епт

LexsZero
03.04.2017
23:50:24
тогда задача сводится к той что я вспомнил, а потом передумал

Serge
03.04.2017
23:50:34
вот такой yaml (да, это Distonic :)) test: - name: go test docker_run: cmd: go test

вот такой yaml (да, это Distonic :)) test: - name: go test docker_run: cmd: go test
ну и я всё красиво раскрываю, но внутри получается, что я узнаю, что оно "docker_run", когда у меня уже есть распарсенные в interface{} данные

LexsZero
03.04.2017
23:51:59
а ты анмаршали по частям

Serge
03.04.2017
23:52:16
т.е. не маршалить же обратно этот интерефейс

LexsZero
03.04.2017
23:52:26
сначала в структуру-затычку с единственным полем определяющим тип вложенной структуры

Serge
03.04.2017
23:52:39
а ты анмаршали по частям
а вот как. у меня там есть name и это часть родительской структуры

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

там и так всё кастомными методами разбирается

Phil
03.04.2017
23:54:42
это ведь оно? https://golang.org/pkg/encoding/json/#RawMessage

(примеры посмотри)

Serge
03.04.2017
23:55:20
епт, я посомотрю, только в yaml

Google
Serge
03.04.2017
23:55:23
yaml

yaml

Phil
03.04.2017
23:55:52
епт, я посомотрю, только в yaml
Код оттуда выкрути и сделай для yaml

Или вообще закинь в тот yaml

Serge
03.04.2017
23:56:14
я там только https://godoc.org/gopkg.in/yaml.v2#Unmarshaler нашел и схватился за него

LexsZero
03.04.2017
23:56:23
то есть у тебя есть, допустим type Base struct { Name String Value SomeData // это интерфейс, который имплементируют твои возможные вложенные структуры }

Serge
03.04.2017
23:56:36
точно

Phil
03.04.2017
23:56:46
что бля?
Посмотри как для json сделали и выдерни тот код себе

Alex
03.04.2017
23:58:22
666 чуваков

Alex
03.04.2017
23:58:28
Давайте Лига забаним

А то чот сотонизм

Что Лиг вообще делает в гошном чате?

Phil
03.04.2017
23:59:27
забань себя;)
Сам себя забань. Я не понимаю твое жопоболи. Нет готового решения. Свистни которое для JSON. Один хрен там как раз обыгрышь того что тебе надо

LexsZero
04.04.2017
00:01:17
ты определяешь для него анмаршалер, в котором делаешь что-то в духе экземпла RawMessage Unmarshal который выше кинули

Serge
04.04.2017
00:01:27
и вот в value я узнаю что положить по имени поля в yaml
в общем, я нашел вот https://github.com/go-yaml/yaml/blob/v2/yaml.go#L84 по ходу с этого мест, если не парсить, то прямо оно;) сделать что ли парсилку интерфейсов из этого и положить в паблик;)

LexsZero
04.04.2017
00:02:34
только не с отложенным парсингом, а с дополнительной одноразовой говноструктурой чтоб выпарсить только имя для дальнейшего диспатчинга типов, создания этой базовой структурки с нужным типом валуе, и повторного анмаршалинга всей хуйни уже в нее

Serge
04.04.2017
00:02:40
Сам себя забань. Я не понимаю твое жопоболи. Нет готового решения. Свистни которое для JSON. Один хрен там как раз обыгрышь того что тебе надо
когда поймешь, советуй. ты понимаешь вообще, что там не вставится оно, ты нашел какой-то Raw, которого нет в yaml парсере, мне что весь парсер форкать, чтобы всю его архитектуру поменять. я как-то вот не хочу его переписывать.

Google
LexsZero
04.04.2017
00:03:21
ээ што

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

LexsZero
04.04.2017
00:04:05
ты не поверишь

руками и свитчем

Serge
04.04.2017
00:04:15
руками и свитчем
это не очень приятно, я пришел с вопросом нет ли чего интереснее

вот есть же ощущение, что типовая задача, прямо вот совсем

Admin
ERROR: S client not available

LexsZero
04.04.2017
00:05:02
ну можешь упороться и сделать подобное через рефлект

Serge
04.04.2017
00:05:25
причем вот она прямо внутри yaml парсера решена. т.е. мне нужен маршаллер без парсера:)

а не парсер без маршалера, Фил

LexsZero
04.04.2017
00:06:25
https://github.com/lexszero/zeroui/blob/master/ui_widgets.go#L34-L48 вот еще такая наркомания есть

у тебя формат ямла фиксированный или нет?

Serge
04.04.2017
00:07:23
https://github.com/lexszero/zeroui/blob/master/ui_widgets.go#L34-L48 вот еще такая наркомания есть
не вариант, я не хочу знать в этом месте существующие варианты, они из реестра динамически дергаются

LexsZero
04.04.2017
00:07:53
ээ, структуры под них ты тоже динамически определяешь?

Serge
04.04.2017
00:07:56
у тебя формат ямла фиксированный или нет?
ниет;) ну т.е. в этом месте может быть любой ключ, который соответствует модулю в реестре

Google
LexsZero
04.04.2017
00:08:21
ниет;) ну т.е. в этом месте может быть любой ключ, который соответствует модулю в реестре
эмм, всмысле ты его сам выдумал, или надо с чем-то взаимодействовать?

Serge
04.04.2017
00:08:29
я дергаю по имени из реестра и могу знать про него теперь что хочу

сейчас я тупо ему даю interface и пусть само разбирается как себя создать

и там вот свитчи всякие с type assertion

но я бы модуль с удовольствием из yaml бы инициализировал

в общем, я всё понял;) спасибо ребята:) я думал, может я просто не знаю чего;)

Phil
04.04.2017
00:13:56
Если что, неимоверно запутанный JSON-зависимый код RawMessage вот тут https://golang.org/src/encoding/json/stream.go

LexsZero
04.04.2017
00:16:06
я спросил про жсон к тому, что можно перехуярить формат ямла немного переделать и сделать структуру с поинтерами на все возможные типы, вроде того: https://github.com/lexszero/zeroui/blob/master/ui_widgets.go#L24-L28 какой ключ отпарсился - тот и молодец, соответственно название ключа определяет тип хуйни которая в нем лежит. потом смотрим кто отпарсился и вытаскиваем его наверх.

"посмотреть кто отпарсился" если лень писать и поддерживать можно сделать тупо итерацией по элементам структуры через рефлект, это 10 строчек.

Serge
04.04.2017
00:18:24
Если что, неимоверно запутанный JSON-зависимый код RawMessage вот тут https://golang.org/src/encoding/json/stream.go
именно поэтому он бесполезен, мне неоткуда взять кусочек байтиков

"посмотреть кто отпарсился" если лень писать и поддерживать можно сделать тупо итерацией по элементам структуры через рефлект, это 10 строчек.
что-то мне кажется, что собирать динамически структуру по имеющимся в реестре ключам - это несколько больший хак, чем давать каждому модулю по своему желанию разобрать interface{}

сейчас я сделал вот так https://github.com/stonicio/distonic/blob/feature/mvp/job.go#L24

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

я думаю, это задача для следующего подхода, поздно уже;)

LexsZero
04.04.2017
00:25:15
ну что у тебя такое модуль? это структура реализующая некоторый интерфейс, так?

Serge
04.04.2017
00:25:30
мозг все равно с рефакторингм вряд ли справится уже

LexsZero
04.04.2017
00:27:41
например, сделай в этой структуре публичные поля, десериализуй прямо ее (без возни с передачей interface{} куда-то там), и добавь в интерфейс Init() который будет дергаться из твоего хитрого анмаршалера, брать значения из структуры и делать всю инициализационную работу. в итоге у тебя просто анмаршалинг конфига проинициализирует небо и аллаха

я тут еще штуку придумал

type ModuleFoo struct { A Int } type ModuleBar struct { B String } var Modules = map[string]interface{}{ "foo": ModuleFoo{}, "bar": ModuleBar{}, } и из кода реализующего модул просто в init() регистристрируешь нужный тип в этой мапе и у тебя волшебным образом появляется возможность инитить еще один тип модуля

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