为什么Golang无法从以小写字母开头的结构体生成json?

40
我想从我创建的结构体中打印JSON结果,代码如下:

I am trying to print json result from struct I created as following:


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
}

它可以工作!但是为什么那个首字母是小写的单词不起作用呢?


2
可能是 https://dev59.com/HWgt5IYBdhLWcg3w8h_e#11694255 的重复问题。 - jimt
有没有关于导出和导入字段的概念?你能给我一个链接吗?那将是一个很大的帮助! - A-letubby
不需要了,我现在找到了。完全可以理解。 http://golang.org/ref/spec#Exported_identifiers - A-letubby
1
可能是JSON和处理未导出字段的重复问题。 - Jonathan Hall
1个回答

81

Go使用大小写来确定特定标识符在包的上下文中是公共的还是私有的。在第一个示例中,由于json.Marshal不是包含您代码的包的一部分,因此该字段对其不可见。当您将字段更改为大写时,它们变成了公共的,因此可以被导出。

如果您需要在JSON输出中使用小写标识符,则可以使用所需的标识符对字段进行标记。例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接