私のアプリケーションでは、文字列が人間が読めるかどうかは関係ありません。
構造体を文字列にエンコードする一般的な方法の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="}
「デバッグ」や「ロギング」などの「一方向」のシリアル化の場合、fmt.Printf("%#v", var)
は非常に便利です。 (更新:出力を印刷する代わりに文字列に入れるには、str := fmt.Sprintf("%#v", var)
を使用します。
サイズが重要な場合は、%v
を使用できますが、%#v
が好きです。フィールド名と構造体型の名前も含まれるためです。
3番目のバリエーションは%+v
で、これにはフィールド名が含まれますが、構造体タイプは含まれません。
これらはすべて fmt documentation の上部に記載されています。
双方向のシリアル化が必要な場合、GobまたはXMLがGoの最も簡単な/組み込みのオプションです。 エンコードパッケージ を参照してください。
その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)
}
したがって、この構造体フィールドを印刷すると文字列が返されます。
fmt.Println(urls.URLS)
String()関数を名前付き構造体にアタッチすると、構造体を文字列に変換できます。
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!