
Sander
03.04.2017
22:15:45
хпх
так что пхп так крут? или нет

Alexey
03.04.2017
22:18:06

Kirill
03.04.2017
22:18:55

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

LexsZero
03.04.2017
23:49:37
так тебе зависимые типы нужны
!
а в го их нету, так что начинаются костыли

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

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

Phil
03.04.2017
23:50:30

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

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
там и так всё кастомными методами разбирается

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

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 сделали и выдерни тот код себе

Serge
03.04.2017
23:57:11

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

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

Serge
04.04.2017
00:02:40

Google

Serge
04.04.2017
00:03:04

LexsZero
04.04.2017
00:03:21
ээ што
если сделать анмаршал в структуру с одним полем - оно перелопатит весь инпут, вместо того чтоб тупо найти одно значение и остановиться?

Serge
04.04.2017
00:03:53

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 парсера решена. т.е. мне нужен маршаллер без парсера:)
а не парсер без маршалера, Фил

Phil
04.04.2017
00:06:13

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

Phil
04.04.2017
00:07:05

Serge
04.04.2017
00:07:23

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

Serge
04.04.2017
00:07:56

Google

Serge
04.04.2017
00:08:12

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
сейчас я сделал вот так 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() регистристрируешь нужный тип в этой мапе и у тебя волшебным образом появляется возможность инитить еще один тип модуля