golang结构体的标签使用总结
golang标签介绍
在 Go 语言中,结构体字段可以使用标签(Tag)来附加元数据。标签是包含在字段声明的后方,由一对反引号 括起来的字符串,例如:json:“name”`。在使用标签时,需要使用反射的相关函数来解析和使用标签的值。标签和反射一起使用,为我们提供了在运行时动态处理结构体字段的能力,例如通过标签解析结构体,并根据标签的值进行字段映射、表单验证、JSON 或数据库的序列化与反序列化等操作。
1. url
url
标签使用的格式是key:"value"
,其中,key
是标签名,value
是标签的值。在url
标签中,常用的标签名有以下几个:
url:"name"
:指定字段在URL查询参数中的名称,用于序列化时将字段命名为指定的名称。url:"omitempty"
:表示当字段的值为空时,不会包括该字段的查询参数。url:"-"
:表示忽略该字段,不会进行URL查询参数的序列化和反序列化。url:"omitempty, name"
:可以同时使用多个标签选项。
以下是一个使用url
标签的示例:
type User struct {
Name string `url:"name"`
Age int `url:"age"`
IsActive bool `url:"active,omitempty"`
}
在使用encoding/url
包进行URL查询参数的序列化和反序列化时,可以利用url
标签来指定结构体字段与URL查询参数之间的映射关系。
可配合gin框架使用
func(c *Context)ShouldBindQuery(obj any) error
来将url的参数进行序列化,obj为序列化的结构体
2. binding
在 Go 语言中,结构体的 binding
标签用于指定结构体字段在进行数据绑定(如表单数据绑定或请求体绑定)时的规则和验证。用于gin验证器。
常用的标签名有以下几个:
required
:表示该字段是必需的,不能为空。min
:指定字段的最小值。max
:指定字段的最大值。eq
: 等于,如:binding:“eq=3”ne
: 不等于,如:binding:“ne=12”gt
: 大于gte
: 大于等于lt
: 小于lte
: 小于等于eqfield
: 等于其它字段,如; Password string `bingding:“eqfield=ConfirmPassword”` 表示密码和确认密码一致nefield
: 不等于其它字段email
:验证字段是否为有效的电子邮件地址。如:binding:“email”url
:验证字段是否为有效的 URL。如:binding:“url”datetime
:验证字段是否为有效的日期时间格式。len
:指定字段的长度。default
:指定字段的默认值。omitempty
:指定当字段为空时,绑定时忽略该字段。oneof
:枚举验证,如:binding:“oneof=man woman”, 只能为man或者womancontains
: 字符串验证,包含某字符串,如:binding:“contains=love”excludes
: 字符串验证,不包含某字符串, 如:binding:“contains=money”startswith
字符串验证,字符串前缀endswith
:字符串验证,字符串后缀pattern
:使用正则表达式验证字段的值。datetime
: 日期格式验证,如:binding:“datetime=2006-01-02 15:04:05”,注:时间必须是2006年1月2号下午3点4分5秒,不可以修改年月日时分秒的值。- 忽略字段:binding:“-”
还有数组和网络验证等,不一一列举
可使用自定义验证的错误信息:
如:
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 序列化和反序列化过程中的行为。以下是使用 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.Marshal
函数将结构体转换为JSON
字节切片 []byte
通过 json.Unmarshal
函数将 JSON
字节切片[]byte
转换为结构体。需要注意的是,必须将结构体的指针传递给 json.Unmarshal
函数,以便在函数内部修改结构体的值。