语法
在Go语言中,结构体(struct)可以通过添加tag来为结构体中的字段添加元数据,例如序列化、反序列化等操作的配置信息。
结构体tag是一个以反引号(`)包含的键值对列表,其中键与值之间使用冒号(:)分隔,键值对之间使用空格分隔。tag的格式如下所示:
`key1:"value1" key2:"value2"`
其中,key是一个字符串,代表tag的名字,value可以是任何合法的字符串,代表tag的值。一个结构体中的字段可以有多个tag,每个tag之间使用空格分隔。例如:
type User struct {
Name string `json:"name" xml:"name"`
Password string `json:"-" xml:"-"`
Age int `json:"age" xml:"age"`
}
在这个例子中,User结构体中的每个字段都有一个tag。Name字段的tag为json:"name" xml:"name"
,表示当将User结构体序列化成JSON或XML格式时,Name字段应该使用”name”作为键。Password字段的tag为json:"-" xml:"-"
,表示当将User结构体序列化成JSON或XML格式时,Password字段应该被忽略。Age字段的tag为json:"age" xml:"age"
,表示当将User结构体序列化成JSON或XML格式时,Age字段应该使用”age”作为键。
需要注意的是,tag是在编译时解析的,因此在运行时无法修改tag的值。
总结起来就是:反引号括起来,key不加双引号,value加双引号,多个值中间用空格分开
常见实例
json
package main
import (
"encoding/json"
"fmt"
)
type Gopher struct {
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Gender string `json:"gender,omitempty"`
}
func main() {
master := Gopher{
Name: "Anubis",
Age: 20,
Gender: "man",
}
out, err := json.MarshalIndent(master, "", " ")
if err != nil {
fmt.Println(err)
panic(err)
}
fmt.Println(string(out))
}
xml
package main
import (
"encoding/xml"
"fmt"
)
type Gopher struct {
Name string `xml:"name,omitempty"`
Age int `xml:"age,omitempty"`
Gender string `xml:"gender,omitempty"`
}
func main() {
master := Gopher{
Name: "Anubis",
Age: 20,
Gender: "man",
}
out, err := xml.MarshalIndent(master, "", " ")
if err != nil {
fmt.Println(err)
panic(err)
}
fmt.Println(string(out))
}