golang标签介绍
在 Go 语言中,结构体字段可以使用标签(Tag)来附加元数据。标签是包含在字段声明的后方,由一对反引号 括起来的字符串,例如:json:“name”`。在使用标签时,需要使用反射的相关函数来解析和使用标签的值。标签和反射一起使用,为我们提供了在运行时动态处理结构体字段的能力,例如通过标签解析结构体,并根据标签的值进行字段映射、表单验证、JSON 或数据库的序列化与反序列化等操作。
1. url
urlkey:"value"keyvalueurl
url:"name"url:"omitempty"url:"-"url:"omitempty, name"
url
type User struct {
Name string `url:"name"`
Age int `url:"age"`
IsActive bool `url:"active,omitempty"`
}
encoding/urlurl
func(c *Context)ShouldBindQuery(obj any) error
2. binding
binding
常用的标签名有以下几个:
requiredminmaxeqnegtgteltlteeqfieldnefieldemailurldatetimelendefaultomitemptyoneofcontainsexcludesstartswithendswithpatterndatetime
还有数组和网络验证等,不一一列举
可使用自定义验证的错误信息:
如:
type UserInfo struct{
UserName string `json:"username" binding:"required" msg"用户名不能 为空"`
PassWord string `json:"password" binding:"min=3,max=6" msg"密码长度不能小于3大于6"`
Email string `json:"email" binding:"email" msg"邮箱地址格式不正确"`
}
// 示例:
type User struct {
ID int `binding:"required"`
Name string `binding:"required,min=2,max=50"`
Age int `binding:"required,min=0,max=150"`
Email string `binding:"required,email"`
Password string `binding:"required,min=8"`
Address string `binding:"omitempty"`
}
3.json
json
- 字段名称:可以使用 json:“fieldname” 来指定字段在 JSON 中的名称。例如:
type User struct {
UserName string `json:"name"`
}
在上面的示例中,字段 UserName 在 JSON 中将表示为 “name”。
- 空值处理:通过在标签中使用 omitempty,可以在进行 JSON 序列化时忽略空值字段。例如:
type User struct {
UserName string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
}
在上面的示例中,如果 UserName 或 Age 字段的值为空,则在序列化时将被忽略。
- 忽略字段:通过在标签中使用 “-”,可以完全忽略该字段进行 JSON 序列化和反序列化。
type User struct {
UserName string `json:"-"`
Password string `json:"-"`
}
在上面的示例中,字段 UserName 和 Password 将完全被忽略。
- 嵌套结构体:可以在结构体中嵌套其他结构体,并使用标签指定嵌套结构体的名称和选项。
type User struct {
Name string `json:"name"`
Email string `json:"email"`
}
type Post struct {
Title string `json:"title"`
Content string `json:"content"`
Author User `json:"author"`
}
在上面的示例中,Post 结构体中的 Author 字段将在 JSON 中表示为 “author”,内部的 Name 和 Email 字段保持不变。
- json序列化和反序列化
注:结构体字段需要大写
json.MarshalJSON []byte json.UnmarshalJSON []byte json.Unmarshal