golang

2016-09-22 6 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) 
       } 
      } 
     } 
    } 
} 

このようなものです。しかし、結果は次のとおりです。

typ 
ptr 
flag 
typ 
ptr 
flag 

私はに出力を変更するにはどうすればよい:

Name 
Name 
+1

あなたは 'Test'オブジェクトの配列を持っていますが、本当にこれらのアイテムをいくつかのインターフェースとして扱う必要がありますか?サンプルでは、​​必ずしも必要ではありませんが、それは単なる例であり、いくつかの説明が参考になります。これが本当にあなたのコードを代表するものであれば、100%は 'result [i] .Name'を行い、リフレクションやインターフェースには全く触れないようにしてください。 – evanmcdonnal

+0

@evanmcdonnal Testオブジェクトは単なるサンプル用です。どのインタフェースがダンプ機能に渡されるのかわかりません。 – ahmdrz

答えて

0

あなたの例で本当に多くの詳細を使用しますが、ここであなたが提供した内容オフに基づいて助けで私の最高の試みである可能性があります。ダンプの定義は次の通りと仮定しています。

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を続け、FieldName2の後にectをつけて、そうでない場合とはかなり違って見えるように)現在のインスタンス上の各フィールドを順番に印刷するなど)。しかし、これはあなた自身について心配する必要がある、またはあなたの質問の更新で指定する必要がある詳細です。ここで話題の良い読書。 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