这是某种规范,用于指定程序包如何处理带有标记的字段。
例如:
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标签的字段,我们声明字段电子邮件中数据库中的对应列必须为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的数据必须具有用户和密码字段,因为这些字段已按要求进行了标记。
因此,一般性的标签是程序包需要了解的数据,它们应如何处理不同结构类型的数据,而要完全了解程序包所需的标签的最佳方法是完整地阅读包装文件。