去json.Marshal(结构)返回“{}”

type TestObject struct { kind string `json:"kind"` id string `json:"id, omitempty"` name string `json:"name"` email string `json:"email"` } func TestCreateSingleItemResponse(t *testing.T) { testObject := new(TestObject) testObject.kind = "TestObject" testObject.id = "f73h5jf8" testObject.name = "Yuri Gagarin" testObject.email = "Yuri.Gagarin@Vostok.com" fmt.Println(testObject) b, err := json.Marshal(testObject) if err != nil { fmt.Println(err) } fmt.Println(string(b[:])) } 

这是输出:

 [ `go test -test.run="^TestCreateSingleItemResponse$"` | done: 2.195666095s ] {TestObject f73h5jf8 Yuri Gagarin Yuri.Gagarin@Vostok.com} {} PASS 

为什么JSON基本上是空的?

您需要通过以Unicode大写字母开始字段名称来导出 TestObject中的字段。

 type TestObject struct { Kind string `json:"kind"` ID string `json:"id,omitempty"` Name string `json:"name"` Email string `json:"email"` } 

encoding / json包和类似的包忽略未导出的字段。

在字段声明之后的`json:"..."`string是结构标签 。 这个结构体中的标签在与JSON进行封送时设置结构体字段的名称。

操场

  • 当第一个字母大写时 ,标识符将公开给您要使用的任何代码。
  • 当第一个字母是小写字母时 ,标识符是私有的,只能在声明的包中访问。

例子

  var aName // private var BigBro // public (exported) var 123abc // illegal func (p *Person) SetEmail(email string) { // public because SetEmail() function starts with upper case p.email = email } func (p Person) email() string { // private because email() function starts with lower case return p.email }