2017-02-22 80 views
0

Я пытаюсь выполнить итерацию через interfacedialogCommands, что является slice. Я могу проходить через него нормально, и Println в каждый Index дает мне map. Однако, это map печатается как имеющий тип structОтражая кусок карт, каждая карта имеет тип struct?

if reflect.TypeOf(dialogCommands).Kind() == reflect.Slice { 
    commands := reflect.ValueOf(dialogCommands) 

    for i:=0; i<commands.Len(); i++ { 
     v := commands.Index(i) 
     fmt.Println(reflect.TypeOf(v).Kind()) 
     fmt.Println(v) 
    } 

Выход из этого

struct 
map[options:[a b c]] 
struct 
map[startDialogs:[dialog1]] 

Как вы можете видеть, тип является struct но выход является map. Как пройти через keys из v? Я не могу просто лечить эту карту, потому что это типа reflect.Value, так что мне нужен способ итерацию через него, но, как вы видите, kind является struct в то время как Println говорит, что это map

Update:

Вот Dialog структура

type Dialog struct { 
    Dialog bson.Raw `json:"dialog" bson:"dialog"` 
} 

и помните, что dialogCommands получает unmarshaled в interface{}

[map[options:[a b c]] map[startDialogs:[dialog1]]] 
+1

Вы должны включить определение dialogCommands и все, что в нем хранится, а не просто описывать его нам. Лучше всего - полная программа Go, которая будет работать на игровой площадке Go на https://play.golang.org/ –

+0

@ ZanLynx. Я обновил лучшую информацию, как вы думаете, этого достаточно? –

+0

Ну, этого недостаточно, чтобы заинтересовать меня в том, чтобы тыкать. Мне нужно написать все виды кода поддержки, и у меня уже есть работа. Может быть, тебе повезет с кем-то еще. –

ответ

0

Выражение reflect.TypeOf(v).Kind() возвращает вид v, а не базового значения в v. Переменная v имеет тип reflect.Value. Это тип структуры.

Следующие операторы печати напечатает то, что вы ожидаете при условии, что dialogCommands является кусочек карты:

fmt.Println(v.Kind()) // prints the kind of v's underlying value 
    fmt.Println(v)   // prints v's underlying value 

Основываясь на ваш комментарий по этому вопросу, похоже, dialogCommands является ломтика интерфейсов. Если это так, то вы захотите работать с элементом интерфейса:

if v.Kind() == reflect.Interface { 
     v = v.Elem() 
    } 
    fmt.Println(v.Kind()) 
    fmt.Println(v) 
+0

Спасибо, он печатает на месте 'struct'. Но как это возможно, если при печати оно говорит, что это карта? –

+0

Я имею в виду, он печатает «интерфейс» как вид, против «структуры» до –

+0

См. Обновленный ответ. Каков тип 'dialogCommands'? –