web-dev-qa-db-fra.com

Dans Go, comment puis-je obtenir la représentation sous forme de chaîne d'une structure?

Pour mon application, peu importe que la chaîne soit lisible par l'homme ou non.

51
abw333

Un moyen courant d'encoder des structures en chaînes consiste à utiliser JSON .

Vous avez certaines limitations, telles que ne pas obtenir toutes les informations (telles que le type spécifique de chaque champ), ne sérialiser que les champs exportés et ne pas gérer les valeurs récursives. Mais c'est un moyen standard simple de sérialiser des données.

Exemple de travail:

package main

import (
    "fmt"
    "encoding/json"
)

type s struct {
    Int       int
    String    string
    ByteSlice []byte
}

func main() {
    a := &s{42, "Hello World!", []byte{0,1,2,3,4}}

    out, err := json.Marshal(a)
    if err != nil {
        panic (err)
    }

    fmt.Println(string(out))
}

Donnez cette sortie:

{"Int":42,"String":"Hello World!","ByteSlice":"AAECAwQ="}

https://play.golang.org/p/sx-xdSxAOG

65
ANisus

S'il s'agit d'une sérialisation "à sens unique" (pour le débogage, la journalisation ou autre), alors fmt.Printf("%#v", var) est très agréable. (Mise à jour: pour mettre la sortie dans une chaîne au lieu de l’imprimer, utilisez str := fmt.Sprintf("%#v", var).

Si la taille compte, vous pouvez utiliser %v, mais j'aime %#v _ car il inclura également les noms de champs et le nom du type de structure.

Une troisième variante est %+v qui inclura les noms de champs, mais pas le type de structure.

Ils sont tous documentés en haut de la documentation fmt .

Si vous avez besoin d'une sérialisation bidirectionnelle, JSON, Gob ou XML sont les options les plus faciles/intégrées de Go, consultez la section packages de codage .

71

vous pouvez également ajouter une fonction avec ce récepteur struct.

// URL : Sitemap Xml
type URL struct {
    Loc string `xml:"loc"`
}

// URLSET : Sitemap XML
type URLSET struct {
    URLS []URL `xml:"url"`
}

// converting the struct to String format. 
func (u URL) String() string {
    return fmt.Sprintf(u.Loc)
}

Donc, imprimer ce champ struct retournera une chaîne.

fmt.Println(urls.URLS)
4
Santosh Pillai

Associer une fonction String () à une structure nommée nous permet de convertir une structure en chaîne.

package main

import "fmt"

type foo struct {
    bar string
}

func (f foo) String() string {
    return fmt.Sprintf("Foo Says: %s", f.bar)
}

func main() {
    fmt.Println(foo{"Hello World!"})
}
output:
Foo Says: Hello World!
0
Arghyadeb