在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", "bob@mycompany.com"}
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表单数据。