web-dev-qa-db-ja.com

Goでは、どのようにして構造体の文字列表現を取得できますか?

私のアプリケーションでは、文字列が人間が読めるかどうかは関係ありません。

51
abw333

構造体を文字列にエンコードする一般的な方法の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

65
ANisus

「デバッグ」や「ロギング」などの「一方向」のシリアル化の場合、fmt.Printf("%#v", var)は非常に便利です。 (更新:出力を印刷する代わりに文字列に入れるには、str := fmt.Sprintf("%#v", var)を使用します。

サイズが重要な場合は、%vを使用できますが、%#vが好きです。フィールド名と構造体型の名前も含まれるためです。

3番目のバリエーションは%+vで、これにはフィールド名が含まれますが、構造体タイプは含まれません。

これらはすべて fmt documentation の上部に記載されています。

双方向のシリアル化が必要な場合、GobまたはXMLがGoの最も簡単な/組み込みのオプションです。 エンコードパッケージ を参照してください。

71

その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)
4
Santosh Pillai

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!
0
Arghyadeb