在Go语言规范中,提到了struct标签的简短概述:
字段声明后面可以跟一个可选的字符串文字标签,该标签成为相应字段声明中所有字段的属性。通过反射接口可以看到这些标签,但其他方面将忽略它们。
例如:
// 一个对应于TimeStamp协议缓冲区的struct。
// 标签字符串定义协议缓冲区字段号。
struct {
microsec uint64 "field 1"
serverIP6 uint64 "field 2"
process string "field 3"
}
虽然这是一个非常简短的解释,但struct标签在Go语言中具有重要的用途。
1. 数据格式转换
struct标签常用于定义字段在进行编码或解码时的转换信息。例如,encoding/json
包使用struct标签来控制字段如何在JSON和结构体之间进行映射。
type User struct {
Name string `json:"name"`
}
在这个例子中,json:"name"
标签告诉JSON编码器将Name
字段映射到JSON对象中的name
字段。
2. 数据库映射
ORM(对象关系映射)包,例如gorm
,使用struct标签来定义字段与数据库列的对应关系。
type User struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"size:255"`
Email string `gorm:"type:varchar(100);unique_index"`
}
在这个例子中,gorm
标签定义了ID
字段为主键,Name
字段的大小为255,Email
字段为唯一索引且类型为varchar(100)
。
3. 验证
一些验证包使用struct标签来定义字段的验证规则。例如,gin
框架中的binding
标签可以用于验证API请求的数据。
type Login struct {
User string `form:"user" json:"user" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
}
在这个例子中,binding:"required"
标签告诉gin
框架这些字段是必需的。
4. 反射
使用反射可以在运行时访问struct标签。通过反射获取字段的类型,然后可以访问该字段的标签。
type User struct {
Name string `mytag:"MyName"`
Email string `mytag:"MyEmail"`
}
u := User{"Bob", "[email protected]"}
t := reflect.TypeOf(u)
for _, fieldName := range []string{"Name", "Email"} {
field, _ := t.FieldByName(fieldName)
fmt.Printf("Field: %s, Tag: %s\n", fieldName, field.Tag.Get("mytag"))
}
输出:
Field: Name, Tag: MyName
Field: Email, Tag: MyEmail
常见的Struct标签键
以下是一些常见的struct标签键及其用途:
json
:用于encoding/json
包。xml
:用于encoding/xml
包。bson
:用于MongoDB的BSON格式。gorm
:用于gorm
包。valid
:用于验证包如govalidator
。form
:用于解析HTML表单数据。