它是某种规范,指定包如何处理带有标签的字段。
例如:
type User struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}
json 标记通知json
包编组以下用户的输出
u := User{
FirstName: "some first name",
LastName: "some last name",
}
会是这样的:
{"first_name":"some first name","last_name":"some last name"}
另一个例子是gorm
包标签声明必须如何进行数据库迁移:
type User struct {
gorm.Model
Name string
Age sql.NullInt64
Birthday *time.Time
Email string `gorm:"type:varchar(100);unique_index"`
Role string `gorm:"size:255"` // set field size to 255
MemberNumber *string `gorm:"unique;not null"` // set member number to unique and not null
Num int `gorm:"AUTO_INCREMENT"` // set num to auto incrementable
Address string `gorm:"index:addr"` // create index with name `addr` for address
IgnoreMe int `gorm:"-"` // ignore this field
}
在此示例中,对于Email
带有 gorm 标签的字段,我们声明数据库中字段 email 的对应列必须是 varchar 类型,最大长度为 100,并且它还必须具有唯一索引。
另一个例子是在包binding
中最常使用的标签。gin
type Login struct {
User string `form:"user" json:"user" xml:"user" binding:"required"`
Password string `form:"password" json:"password" xml:"password" binding:"required"`
}
var json Login
if err := c.ShouldBindJSON(&json); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
此示例中的绑定标记向 gin 包提示发送到 API 的数据必须具有用户和密码字段,因为这些字段是按要求标记的。
所以一般标签是包需要知道他们应该如何处理不同结构类型的数据的数据,熟悉包需要的标签的最佳方法是完整地阅读包文档。