У меня есть следующее, которое работает:
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, который просто возвращает свой собственный тип после нахождения поля по имени. Я не уверен, как поддержать это, однако. Идеи?
Нет - мне вообще не нужен оператор switch - он кажется ненужным.
Извините, я не понимаю. В этом смысл «переключателя типа», он заключается в условном утверждении нескольких возможных типов. Вы можете избавиться от переключателя или отдельных утверждений, но не от того и другого одновременно.
Хм... ну, я хочу сразу захватить поле и тип. Кажется безумием, что я не могу этого сделать. Почему я не могу этого сделать?
Извините, я все еще не слежу. subItem — это отраженное значение, и вы можете проверить тип как reflect.Type, но это не настоящий тип, и его можно использовать только в отражении. Однако в вашем примере здесь даже не нужны утверждения типа, потому что вы делаете одно и то же независимо от типа, вы можете просто поместить subItem.Interface() в bson.D.
Я собирался сказать, что, учитывая код примера, вообще не набирайте switch (godoc.org/labix.org/v2/mgo/bson#DocElem). в общем случае переключатель кажется подходящим для этой конкретной ситуации с базовыми типами.





Я не совсем понимаю ваш вопрос, но то, что вы делаете, можно легко сократить, не затрагивая функциональность:
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())
Извините, ребята, я запутался. Я все еще не совсем привык к строго типизированным языкам. Спасибо за ответы.
Вы имеете в виду как stackoverflow.com/questions/36091801/…?