2017-02-22 1 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이다

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

이다. keys을 반복하는 방법은 v입니까?

가 여기 다음 Println 그것이 map

업데이트 말한다 동안 유형 reflect.Value의 때문에 난 그냥이지도를 취급 할 수없는, 그래서 그것을 반복 할 수있는 방법이 필요하지만, 당신이 보는대로 kindstruct입니다 Dialog 구조

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

dialogCommandsinterface{}

에 비 정렬 화됩니다 기억
+1

dialogCommands의 정의를 포함시켜야합니다. 무엇보다도 Go Playground에서 실행되는 완벽한 Go 프로그램이 https://play.golang.org/에서 실행됩니다. –

+0

@ ZanLynx 더 나은 정보로 업데이트되었는데, 충분하다고 생각합니까? –

+0

글쎄, 나를 파고 들기에 충분하지 않다. 나는 모든 종류의 지원 코드를 써야하고 이미 직업을 가지고있다. 어쩌면 너는 다른 누군가와 운이 좋을 것이다. –

답변

0

reflect.TypeOf(v).Kind()은 종류가 v이 아닌 v을 반환합니다. 변수 v는 reflect.Value입니다. 이것은 struct 유형입니다.

다음 인쇄 문

dialogCommands이지도의 조각이라고 가정 기대 인쇄됩니다 : dialogCommands는 인터페이스의 슬라이스처럼이 질문에 대한 귀하의 의견을 바탕으로

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

, 그것은 보인다. 그렇다면 인터페이스의 요소로 작업하고 싶을 것입니다 :

+0

감사합니다. 'struct'대신 인쇄됩니다. 그러나 인쇄 될 때 그것이지도라고한다면 어떻게 가능할까요? –

+0

내 말은, 이전에 '구조체'와 반대되는 종류의 '인터페이스'를 인쇄합니다. –

+0

업데이트 된 답변보기. 'dialogCommands'의 타입은 무엇입니까? –

관련 문제