go语言struct tag(详解)

 

这里以XML为例,例子取自书籍(go web 编程)

type Recurlyservers struct {
   XMLName     xml.Name `xml:"servers"`
   Version     string   `xml:"version,attr"`
   Svs         []server `xml:"server"`
   Description string   `xml:",innerxml"`
}
type server struct {
   XMLName    xml.Name `xml:"server"`
   ServerName string   `xml:"serverName"`
   ServerIP   string   `xml:"serverIP"`
}
  • 如果struct中有一个叫做XMLName,且类型为xml.Name字段,那么在解析的时候就会保存这个element的名字到该字段,如上面例子中的servers。
  • 如果某个struct字段的tag定义中含有XML结构中element的名称,那么解析的时候就会把相应的element值赋值给该字段,如上servername和serverip定义。
  • 如果某个struct字段的tag定义了中含有",attr",那么解析的时候就会将该结构所对应的element的与字段同名的属性的值赋值给该字段,如上version定义。
  • 如果某个struct字段的tag定义 型如"a>b>c",则解析的时候,会将xml结构a下面的b下面的c元素的值赋值给该字段。
  • 如果某个struct字段的tag定义了"-",那么不会为该字段解析匹配任何xml数据。
  • 如果struct字段后面的tag定义了",any",如果他的子元素在不满足其他的规则的时候就会匹配到这个字段。
  • 如果某个XML元素包含一条或者多条注释,那么这些注释将被累加到第一个tag含有”,comments”的字段上,这个字段的类型可能是[]byte或string,如果没有这样的字段存在,那么注释将会被抛弃。

注意: 为了正确解析,go语言的xml包要求struct定义中的所有字段必须是可导出的(即首字母大写)

 

type Servers struct {
   XMLName xml.Name `xml:"servers"`
   Version string   `xml:"version,attr"`
   Svs     []server `xml:"server"`
}
type server struct {
   ServerName string `xml:"serverName"`
   ServerIP   string `xml:"serverIP"`
}

我们应如何设置struct 中字段的tag信息以控制最终xml文件的生成呢?

  • XMLName不会被输出
  • tag中含有"-"的字段不会输出
  • tag中含有"name,attr",会以name作为属性名,字段值作为值输出为这个XML元素的属性,如上version字段所描述
  • tag中含有",attr",会以这个struct的字段名作为属性名输出为XML元素的属性,类似上一条,只是这个name默认是字段名了。
  • tag中含有",chardata",输出为xml的 character data而非element。
  • tag中含有",innerxml",将会被原样输出,而不会进行常规的编码过程
  • tag中含有",comment",将被当作xml注释来输出,而不会进行常规的编码过程,字段值中不能含有”—“字符串
  • tag中含有"omitempty",如果该字段的值为空值那么该字段就不会被输出到XML,空值包括:false、0、nil指针或nil接口,任何长度为0的array, slice, map或者string

 

 

你可能感兴趣的:(golang,struct,tag,go语言)