2013-05-02 25 views

答えて

32

構造体を文字列にエンコードする一般的な方法の1つは、JSONです。

すべての情報(各フィールドの特定の種類など)が得られない、エクスポートされたフィールドをシリアル化する、再帰的値を処理しないなどの特定の制限があります。しかし、それはデータをシリアライズする単純な標準的な方法です。例作業

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

は、この出力を与える:

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

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

+0

まさに私が必要なもの!あなたに+1 – abw333

+0

私はあなたに2番目の質問とあなたの目的が気づいた。 JSONは便利ですが、出力文字列を使用して同等性をテストするハッシュを作成する場合は使用できません。 Askが言いましたように、あなたはマップに問題があります。これは 'fmt.Sprintf'も使用します。 – ANisus

+0

JSONで表示するためにキーを大文字にする必要があることを知らなかった。 – jiyinyiyong

47

それは(デバッグやロギングまたは何のために) "一方通行" 連載だ場合、fmt.Printf("%#v", var)は非常にありますいいね(更新:。それを印刷するのではなく、文字列に出力を置くために、サイズの問題は、あなたが%vを使用できる場合

str := fmt.Sprintf("%#v", var)を使用しますが、それはまた、フィールド名と構造体型の名前が含まれますので、私は%#vが好き。

第三変化はフィールド名が含まれます%+vではなく、構造体型。彼らはすべてのfmt documentation

の上部に記載されています

あなたは双方向のシリアル化JSONが必要な場合は、ゴブr XMLはGoの最も簡単な/組み込みのオプションです。encoding packagesを参照してください。

+0

お返事ありがとうございます。私はおそらく私の質問で私のプログラムではなく、コンソールの価値を得るために探している必要があります指定する必要があります。特に、私はバイト配列に文字列を変換したいと思います。私が "[] byte(fmt.Printf("%v "、var))" "を実行すると、プログラムは"単一値のコンテキストで複数値のfmt.Printf() "について文句を言います。 Printfは文字列の値を返さないので、これをコンソールに出力するだけなので、これを仮定しています。あなたはこれを解決する方法を知っていますか? – abw333

+0

私はANisusの応答を使ってこれを行う方法を理解しましたが、良い答えのためにあなたに+1します。 – abw333

+0

プログラムで必要な場合は、Printfの代わりに 'fmt.Sprintf'を使います。 JSONを使用している場合は、マップ値が各実行で同じ順序で返されないことに注意してください(fmt printfの場合もそうですが、私はチェックしていません)。 –