2013-05-02 7 views

Antwort

32

Eine gängige Methode zum Codieren von Strukturen in Strings ist die Verwendung von JSON.

Sie haben bestimmte Einschränkungen, z. B. dass Sie nicht alle Informationen erhalten (z. B. den spezifischen Typ der einzelnen Felder), nur exportierte Felder serialisieren und keine rekursiven Werte verarbeiten. Aber es ist eine einfache Standardmethode zum Serialisieren von Daten.

Arbeitsbeispiel:

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)) 
} 

Geben Sie diese Ausgabe:

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

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

+0

Genau das, was ich brauchte! +1 zu Ihnen – abw333

+0

Ich bemerkte Ihre zweite Frage und welchen Zweck Sie haben. JSON kann nützlich sein, aber nicht, wenn die Ausgabezeichenfolge zum Erstellen eines Hashs zum Testen der Gleichheit verwendet werden soll. Sie werden Probleme mit Karten haben, wie Ask bereits erwähnt hat. Dies gilt auch für 'fmt.Sprintf'. – ANisus

+0

Wusste nicht, dass Schlüssel groß geschrieben werden müssen, um in JSON angezeigt zu werden. – jiyinyiyong

47

Wenn es sich um eine "one way" Serialisierung ist (für das Debuggen oder die Protokollierung oder was auch immer), dann fmt.Printf("%#v", var) ist sehr nett. (Update: die Ausgabe in einen String zu setzen, anstatt sie zu drucken, verwenden Sie str := fmt.Sprintf("%#v", var)

Wenn size matters Sie %v verwenden können, aber Ich mag %#v, weil es auch werden die Feldnamen und den Namen des Strukturtyps enthalten..

Eine dritte Variante ist %+v, die die Feldnamen enthalten werden, nicht aber der Strukturtyp.

Sie sind alle an der Spitze dokumentieren der fmt documentation.

Wenn Sie zwei-Wege-Serialisierung JSON, Gob o r XML sind die einfachsten/integrierten Optionen in Go, siehe encoding packages.

+0

Danke für Ihre Antwort. Ich hätte wahrscheinlich in meiner Frage angegeben, dass ich den Wert in meinem Programm und nicht in der Konsole suchen möchte. Insbesondere möchte ich dann die Zeichenfolge in ein Byte-Array konvertieren. Wenn ich "[] byte (fmt.Printf ("% v ", var))" mache, beschwert sich das Programm über "multiple-value fmt.Printf() im einwertigen Kontext". Ich gehe davon aus, dass Printf den String-Wert nicht zurückgibt, sondern nur auf die Konsole ausgibt. Weißt du, wie ich das beheben kann? – abw333

+0

Ich habe herausgefunden, wie man das mit der Antwort von ANisus macht, aber +1 für eine gute Antwort. – abw333

+0

Wenn Sie es im Programm benötigen, verwenden Sie 'fmt.Sprintf' anstelle von Printf. Wenn Sie JSON verwenden, sollten Sie darauf achten, dass die Map-Werte bei jedem Lauf möglicherweise nicht in der gleichen Reihenfolge zurückgegeben werden (obwohl dies auch für den fmt printf der Fall ist, habe ich dies nicht überprüft). –

Verwandte Themen