2016-10-10 17 views
0

ここに新しいユーザーがいます。構造体のスライスを文字列のスライスに変換する方法は?

type TagRow struct { 
    Tag1 string 
    Tag2 string 
    Tag3 string 
} 

のようにスライスをyeilds:

:私は私のような文字列のスライスになるスライスを変換することができますどのように思ったんだけど

[{a b c} {d e f} {g h}] 

私は、この構造体オブジェクトのスライスを持っています

["a" "b" "c" "d" "e" "f" "g" "h"] 

私は以下のように反復処理しようとした:

for _, row := range tagRows { 
for _, t := range row { 
    fmt.Println("tag is" , t) 
} 

}

しかし、私は得る:

cannot range over row (type TagRow) 

だからあなたの助けに感謝。私は「手動」にそれを行うだろう、あなたの特定のケースについては

+0

は、より複雑な例と同様の質問を参照してください。 – kichik

+0

@kichikはどうやって分かりませんでした。あなたの答えを教えてください。 – Karlom

答えて

3

rows := []TagRow{ 
    {"a", "b", "c"}, 
    {"d", "e", "f"}, 
    {"g", "h", "i"}, 
} 

var s []string 
for _, v := range rows { 
    s = append(s, v.Tag1, v.Tag2, v.Tag3) 
} 
fmt.Printf("%q\n", s) 

が出力:

["a" "b" "c" "d" "e" "f" "g" "h" "i"] 

あなたはそれが動的にすべてのフィールドを歩くしたい場合は、reflectパッケージを使用することができます。それを使用して

func GetFields(i interface{}) (res []string) { 
    v := reflect.ValueOf(i) 
    for j := 0; j < v.NumField(); j++ { 
     res = append(res, v.Field(j).String()) 
    } 
    return 
} 

:ことないヘルパー関数

var s2 []string 
for _, v := range rows { 
    s2 = append(s2, GetFields(v)...) 
} 
fmt.Printf("%q\n", s2) 

出力は同じです。

["a" "b" "c" "d" "e" "f" "g" "h" "i"] 

Go Playground上の例を試してみてください。あなたは[反映](https://golang.org/pkg/reflect/#example_StructTag)ライブラリを試すことができます

Golang, sort struct fields in alphabetical order

How to print struct with String() of fields?

関連する問題