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

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

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

41 ответов

18 просмотров

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

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

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

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 сообщения), которое на валидность проверить нужно, но на логику это влияет слабо. Стало понятнее, или все еще нет?

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта