golang

2016-09-22 3 views
-2

에서 인터페이스의 배열의 덤프이 같은 인터페이스의 배열이golang


이름을

ahmad

reza


this과 같은 것이지만 배열이 필요합니다.

업데이트

내가 테스트 인터페이스를 덤프하고 싶지 않아 ...

내가 모든 인터페이스를 덤프합니다.

package main 

import (
    "fmt" 
    "reflect" 
) 

type Test struct { 
    Name string 
} 

func main() { 
    result := []Test{ 
     Test{Name: "ahmad"}, 
     Test{Name: "reza"}, 
    } 
    dump(result) 
} 

func dump(datasets interface{}) { 
    items := reflect.ValueOf(datasets) 
    if items.Kind() == reflect.Slice { 
     for i := 0; i < items.Len(); i++ { 
      item := items.Index(i) 
      if item.Kind() == reflect.Struct { 
       s := reflect.ValueOf(item) 
       t := reflect.TypeOf(item) 
       for j := 0; j < s.NumField(); j++ { 
        fmt.Println(t.Field(j).Name) 
       } 
      } 
     } 
    } 
} 

이와 비슷한 것입니다. 그러나 결과는 다음 정말 더 자세한 정보를 사용할 수

Name 
Name 
+1

당신은'Test' 객체의 배열을 가지고 있습니다. 정말로이 아이템들을 어떤 인터페이스로 취급해야합니까?샘플에서는 반드시 필요한 것은 아니지만 단지 예제 일 뿐이므로 일부 설명이 도움이됩니다. 이것이 정말로 당신의 코드를 대표한다면 100 %는'result [i] .Name'을하고 반사 나 인터페이스를 전혀 건드리지 말아야합니다. – evanmcdonnal

+0

@evanmcdonnal Test 개체는 샘플 용입니다. 어떤 인터페이스가 덤프 함수에 전달 될지 모르겠습니다. – ahmdrz

답변

0

귀하의 예 그러나 여기에서 당신은 당신이 제공 한 내용을 기반으로 돕는에서 최선 시도는 다음과 같습니다

typ 
ptr 
flag 
typ 
ptr 
flag 

가 어떻게 출력을 변경할 수 있습니다. 나는 덤프 정의가 다음과 같다고 가정합니다.

func dump(items []interface{}) 

그리고 특별히에 전달 무엇에 Name 필드를 인쇄하는 대신에 전달 된 개체의 모든 필드를 인쇄 할 말을 찾고있는

func dump(items []interface{}) { 
    fmt.Println("Name") 
    for i := 0; i < len(items); i++ { 
      v := reflect.ValueOf(items[i]) 
      name := v.FieldByName("Name") 
      fmt.Println(name.String()) 
    } 
} 

여기 예를 들어 작업.; https://play.golang.org/p/zUBt6qkuok

사소한 변경으로 수행 할 수있는 모든 필드를 인쇄하려는 경우 j < v.NumField()에서 반복하고 여기에있는 각 필드를 가져 오는 데 v.Field(i)을 사용하면 여기에 다른 루프를 추가하기 만하면됩니다. 원하는 수준에 따라이 수준에서 코드를 구성하는 방법은 많이 있습니다 (예 : FieldName1 다음에 값을 입력 한 다음 FieldName2를 입력 한 다음 값을 변경하면 코드가 달라지는 경우와 많이 달라짐). 헤더를 포함하거나 현재 인스턴스의 각 필드를 차례로 인쇄). 그러나 이것들은 자신에 대해 걱정하거나 질문에 대한 업데이트를 지정해야하는 세부 사항입니다. 주제에 대한 좋은 읽을 거리; https://blog.golang.org/laws-of-reflection

또한 반사 패키지 문서는 매우 유용합니다.

+0

질문에 대한 업데이트 된 메모를 읽으십시오. 어떤 인터페이스가 덤프에 전달되는지 알면 매우 간단합니다. 나는 기능을 수행하는 인터페이스에 대해 아무것도 모른다. – ahmdrz

0

나는 길을 찾는다!

package main 

import (
    "fmt" 
    "reflect" 
) 

type Test struct { 
    Name string 
} 

func main() { 
    result := []Test{ 
     Test{Name: "ahmad"}, 
     Test{Name: "reza"}, 
    } 
    dump(result) 
} 

func dump(datasets interface{}) { 
    items := reflect.ValueOf(datasets) 
    if items.Kind() == reflect.Slice { 
     for i := 0; i < items.Len(); i++ { 
      item := items.Index(i) 
      if item.Kind() == reflect.Struct { 
       v := reflect.Indirect(item) 
       for j := 0; j < v.NumField(); j++ { 
        fmt.Println(v.Type().Field(j).Name, v.Field(j).Interface()) 
       } 
      } 
     } 
    } 
} 

https://play.golang.org/p/JUAnVoSAwc

감사합니다.

+0

https://github.com/ahmdrz/godumper – ahmdrz