web-dev-qa-db-fra.com

Convertir l'interface [] en chaîne [] dans Golang

J'utilise le package github.com/fatih/structs pour convertir les valeurs de tous les champs d'une structure en []interface{} Avec la fonction toValues(). Voir ici . Cela fonctionne bien, mais finalement je veux écrire les valeurs dans un fichier csv en utilisant le package csv. La fonction csv.Write() requiert []string Comme entrée.

Donc en bref: comment convertir facilement la sortie de toValues() en un tableau de chaînes?

9
Rogier Lommers

Vous ne pouvez pas simplement convertir []interface{} En []string Même si toutes les valeurs sont de type concret string, car ces 2 types ont une disposition/représentation de mémoire différente. Pour plus de détails, voir Impossible de convertir la chaîne [] en interface [] {} .

Vous devez définir comment vous voulez que les valeurs de différents types soient représentées par des valeurs string.

Le moyen le plus simple et le plus judicieux serait d'itérer sur les valeurs et d'utiliser fmt.Sprint() pour obtenir une représentation string de chacune, par exemple:

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)

Sortie (essayez-le sur le 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