web-dev-qa-db-ja.com

なぜGolangは、構造体から小文字の前線を持つjsonを生成できないのですか?

次のように作成した構造体からjsonの結果を出力しようとしています:

type Machine struct {
  m_ip string
  m_type string
  m_serial string
}

そしてプリントアウト

m:= &Machine{ m_ip:"test", m_type:"test", m_serial:"test" }
m_json:= json.Marshal(m)
fmt.Println(m_json)

ただし、結果は{}のみを返しました

次に、次のように単語の最初の文字を大文字に変更しようとしました。

type Machine struct{
  MachIp string
  MachType string
  MachSerial string
}

そしてそれはうまくいきます!とにかく、先頭に小文字の付いたWordが機能しないのはなぜですか。

33
A-letubby

Goはケースを使用して、パッケージのコンテキスト内で特定の識別子がパブリックかプライベートかを判断します。最初の例では、フィールドはコードを含むパッケージの一部ではないため、json.Marshalからは見えません。フィールドを大文字に変更すると、フィールドがパブリックになり、エクスポートできるようになりました。

JSON出力で小文字の識別子を使用する必要がある場合は、必要な識別子でフィールドにタグを付けることができます。例えば:

type Machine struct{
    MachIp     string `json:"m_ip"`
    MachType   string `json:"m_type"`
    MachSerial string `json:"m_serial"`
}
67