Утверждение типа

У меня есть следующее, которое работает:

        reflectItem := reflect.ValueOf(dataStruct)
        subItem := reflectItem.FieldByName(subItemKey)
        switch subItem.Interface().(type) {
            case string:
                subItemVal := subItem.Interface().(string)
                searchData = bson.D{{"data." + 
                  strings.ToLower(subItemKey), subItemVal}}
            case int64:
                subItemVal := subItem.Interface().(int64)
                searchData = bson.D{{"data." + 
                  strings.ToLower(subItemKey), subItemVal}}
        }

Проблема в том, что это кажется очень неэкономным. Я бы очень хотел просто получить тип subItem без оператора switch, который просто возвращает свой собственный тип после нахождения поля по имени. Я не уверен, как поддержать это, однако. Идеи?

Вы имеете в виду как stackoverflow.com/questions/36091801/…?

JimB 06.03.2019 19:45

Нет - мне вообще не нужен оператор switch - он кажется ненужным.

Peter Weyand 06.03.2019 19:46

Извините, я не понимаю. В этом смысл «переключателя типа», он заключается в условном утверждении нескольких возможных типов. Вы можете избавиться от переключателя или отдельных утверждений, но не от того и другого одновременно.

JimB 06.03.2019 19:48

Хм... ну, я хочу сразу захватить поле и тип. Кажется безумием, что я не могу этого сделать. Почему я не могу этого сделать?

Peter Weyand 06.03.2019 19:53

Извините, я все еще не слежу. subItem — это отраженное значение, и вы можете проверить тип как reflect.Type, но это не настоящий тип, и его можно использовать только в отражении. Однако в вашем примере здесь даже не нужны утверждения типа, потому что вы делаете одно и то же независимо от типа, вы можете просто поместить subItem.Interface() в bson.D.

JimB 06.03.2019 19:57

Я собирался сказать, что, учитывая код примера, вообще не набирайте switch (godoc.org/labix.org/v2/mgo/bson#DocElem). в общем случае переключатель кажется подходящим для этой конкретной ситуации с базовыми типами.

mh-cbon 06.03.2019 20:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не совсем понимаю ваш вопрос, но то, что вы делаете, можно легко сократить, не затрагивая функциональность:

    reflectItem := reflect.ValueOf(dataStruct)
    subItem := reflectItem.FieldByName(subItemKey)
    switch subItemVal := subItem.(type) {
        case string:
            searchData = bson.D{{"data." + 
              strings.ToLower(subItemKey), subItemVal}}
        case int64:
            searchData = bson.D{{"data." + 
              strings.ToLower(subItemKey), subItemVal}}
    }

Но помимо этого, я не думаю, что в вашем случае требуется утверждение типа вообще. Это также должно работать:

    reflectItem := reflect.ValueOf(dataStruct)
    subItem := reflectItem.FieldByName(subItemKey)
    searchData = bson.D{{"data."+strings.ToLower(subItemKey), subItem.Interface())

Извините, ребята, я запутался. Я все еще не совсем привык к строго типизированным языкам. Спасибо за ответы.

Peter Weyand 06.03.2019 20:09

Другие вопросы по теме