170 похожих чатов

Привет. Можете, пожалуйста, мне объяснить, почему я не могу сделать

type assertion на тип, неизвестный во время компиляции?

41 ответов

15 просмотров

А зачем? Какая практическая задача стоит?

потому, что никакого другого времени для появления типов не будет. какие есть на момент компиляции - такие и есть, новых не появится

как налить чай в несуществующую кружку?

true- Автор вопроса
Roman Sharkov
как налить чай в несуществующую кружку?

Чашка существует, но неизвестно, какая.

true- Автор вопроса
Daniel Podolsky
потому, что никакого другого времени для появления...

Я не ввожу новые типы, я к существующему привести из интерфейса не могу.

true
Чашка существует, но неизвестно, какая.

А что конкретно нужно? Почему такой сценарий? Чем не устраивает использование через интерфейс?

true- Автор вопроса
Daniel Podolsky
в go все чашки известно, какие

Хорошо. У меня есть чашки разного цвета. Я не знаю в compile time, куда польется чай, но в runtime знаю.

true
Хорошо. У меня есть чашки разного цвета. Я не знаю...

Всё равно пример кода был бы куда более понятным

true
Хорошо. У меня есть чашки разного цвета. Я не знаю...

это стандартная задача для интерфейсов

Roman Sharkov
type НеизвестнаяЧашка interface{}

зачем детей плохому учишь?

Daniel Podolsky
зачем детей плохому учишь?

пытаюсь вытянуть пример кода

true- Автор вопроса
Mikhail Efimov
А что конкретно нужно? Почему такой сценарий? Чем ...

Кучей копипасты не устраивает. У меня есть несколько десятков структур с данными. В некоторых из них есть поля, которые во время обработки необходимо отрезать. А в некоторых нет. Можно спрятать это все под интерфейс, а-ля func (t T) Strip() Intf, но тогда на каждую структуру нужно писать отдельную имплементацию, которая будет прям по полям конкретным возвращать. Через рефлексию у меня почти получилось сделать это красиво - но не совсем. Поля, которые нужно отрезать, сделаны отдельной включенной структурой со своим Strip() методом. Но интерфейс он возвращать не может, т.к. потом я не могу сделать assertion к reflect.Type. Потому что это не тип вовсе. А в compile time мне, естественно, не видно, что там за тип окажется. Решил, что Strip() теперь возвращает конкретные типы, обошелся без assertion.

true- Автор вопроса
Roman Sharkov
пытаюсь вытянуть пример кода

Пример кода займет 10 экранчиков. Если это сжать до 20 строк, то будет не очень понятно, зачем я это делаю.

true
Пример кода займет 10 экранчиков. Если это сжать д...

тогда может быть вы изначально неправильно подходите к решению задачи? Что за задача? Почему вам нужно "отрезать поля" что бы это не значило?

true- Автор вопроса
Roman Sharkov
тогда может быть вы изначально неправильно подходи...

Отрезать - значит, присвоить zero value или аналог. В структурах намешаны поля про бизнес-логику и stateful-детали имплементации, это отражение API. Детали имплементации для проверки валидности бизнес-логики мне необходимо отдельно проверить, там, где это имеет смысл, и выкинуть в помойку, отправив остатки в stateless-историю, которая куски про бизнес логику валидирует.

true
Отрезать - значит, присвоить zero value или аналог...

задача непонятна, это вы скорее про детали имплементации своего подхода объясняете

true
Кучей копипасты не устраивает. У меня есть несколь...

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

true- Автор вопроса
Roman Sharkov
задача непонятна, это вы скорее про детали имплеме...

Окей, задача - оттестировать прослойки между несколькими апишками, притворяясь клиентами с разных сторон. Я не думаю, что стало понятнее.

true- Автор вопроса
Roman Sharkov
своего рода man in the middle?

Нет, это просто клиенты с разных сторон. MITM в данном случае - это сервер, который я и тестирую.

true
Нет, это просто клиенты с разных сторон. MITM в да...

каков протокол коммуникации? JSON? XML? Protobuf?

true- Автор вопроса
true- Автор вопроса
true
И JSON, и кастомный бинарный, и gRPC.

т.е. вам нужно получить JSON, обработать его и передать дальше?

true- Автор вопроса
Mikhail Efimov
И тем не менее, не вижу проблемы в том, чтобы рука...

Руками - плохо. Из 12 полей очень легко пропустить одно. Когда это 40 раз по 12 полей, становится еще легче. Скорость там не важна, все равно все упрется в IO.

true- Автор вопроса
true
Ну, если очень сильно упрощать.

а зачем тогда структуры? Не легче ли запарсить всё в условный map[string]interface{} и динамично обработать?

true
Руками - плохо. Из 12 полей очень легко пропустить...

А это всё время разные 12 полей? И если результат всё равно JSON, то нельзя просто до него и крутить? Обязательно нужна именно промежуточная обрезанная структура?

true- Автор вопроса
Roman Sharkov
а зачем тогда структуры? Не легче ли запарсить всё...

Я ж свитчится запарюсь на 30 разных видов полей. И тем более, как это изначальную проблему решает? Мне все равно нужно куски будет вырезать.

true
Я ж свитчится запарюсь на 30 разных видов полей. И...

Это решит проблему "не могу вернуть разные типы". Потому что тип результата будет один

true- Автор вопроса
Mikhail Efimov
А это всё время разные 12 полей? И если результат ...

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

true
Я ж свитчится запарюсь на 30 разных видов полей. И...

не проще ли вырезать куски из условного map[string]interface{}?

true
Я ж свитчится запарюсь на 30 разных видов полей. И...

а reflect магией не запаритесь? 😅 я не понимаю

true
Не, ну в теории, конечно, можно все. Но да, это, у...

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

true- Автор вопроса
Mikhail Efimov
Это решит проблему "не могу вернуть разные типы". ...

Согласен, но во внутренностях проверки бизнес-логики у меня будет просто нечто абстрактное, что не очень просто будет понять.

true- Автор вопроса
Daniel Podolsky
вы, коллега, настойчиво рассказываете нам про то р...

Есть некоторая система. К системе подключаются клиенты. Клиенты обмениваются через систему сообщениями по некоторому протоколу. Нужно построить конечный автомат вокруг этой системы, который проверял бы то, что взаимодействие с системой согласуется со спецификацией. Вариантов сериализации API - несколько. Возможных валидных и невалидных взаимодействий с системой - десятки, каждое от двух до 15 состояний. В API примешивается куча деталей в рантайме (а-ля timestamp сообщения), которое на валидность проверить нужно, но на логику это влияет слабо. Стало понятнее, или все еще нет?

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта