web-dev-qa-db-ja.com

Golangで[]インターフェースを[]文字列に変換します

github.com/fatih/structs パッケージを使用して、構造体のすべてのフィールドの値をtoValues()関数で_[]interface{}_に変換しています。 こちら を参照してください。これは問題なく機能しますが、最終的にはcsvパッケージを使用してcsvファイルに値を書き込みたいと思います。 csv.Write()関数には、入力として_[]string_が必要です。

つまり、toValues()の出力を文字列の配列に簡単に変換するにはどうすればよいでしょうか。

9
Rogier Lommers

すべての値が具象型stringであっても、_[]interface{}_を_[]string_に単純に変換することはできません。これらの2つの型のメモリレイアウト/表現は異なるためです。詳細は [] stringを[] interface {}に変換できない を参照してください。

さまざまなタイプの値をstring値で表す方法を定義する必要があります。

最も簡単で賢明な方法は、値を反復処理し、 fmt.Sprint() を使用してそれぞれのstring表現を取得することです。例:

_t := []interface{}{
    "zero",
    1, 2.0, 3.14,
    []int{4, 5},
    struct{ X, Y int }{6, 7},
}
fmt.Println(t)

s := make([]string, len(t))
for i, v := range t {
    s[i] = fmt.Sprint(v)
}
fmt.Println(s)
fmt.Printf("%q\n", s)
_

出力( Go Playground で試してください):

_[zero 1 2 3.14 [4 5] {6 7}]
[zero 1 2 3.14 [4 5] {6 7}]
["zero" "1" "2" "3.14" "[4 5]" "{6 7}"]
_
18
icza