golang结构体的标签使用总结(持续更新)

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或者woman
  • contains: 字符串验证,包含某字符串,如: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 标签的一些常见用法:

  1. 字段名称:可以使用 json:“fieldname” 来指定字段在 JSON 中的名称。例如:
type User struct {
    UserName string `json:"name"`
}

在上面的示例中,字段 UserName 在 JSON 中将表示为 “name”。

  1. 空值处理:通过在标签中使用 omitempty,可以在进行 JSON 序列化时忽略空值字段。例如:
type User struct {
    UserName string `json:"name,omitempty"`
    Age      int    `json:"age,omitempty"`
}

在上面的示例中,如果 UserName 或 Age 字段的值为空,则在序列化时将被忽略。

  1. 忽略字段:通过在标签中使用 “-”,可以完全忽略该字段进行 JSON 序列化和反序列化。
type User struct {
    UserName string `json:"-"`
    Password string `json:"-"`
}

在上面的示例中,字段 UserName 和 Password 将完全被忽略。

  1. 嵌套结构体:可以在结构体中嵌套其他结构体,并使用标签指定嵌套结构体的名称和选项。
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 字段保持不变。

  1. json序列化和反序列化

注:结构体字段需要大写

通过json.Marshal函数将结构体转换为JSON字节切片 []byte
通过 json.Unmarshal 函数将 JSON 字节切片[]byte转换为结构体。需要注意的是,必须将结构体的指针传递给 json.Unmarshal 函数,以便在函数内部修改结构体的值。

4. yaml

5.gorm

6. protobuf

7. db

8. protobuf

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用gocraft/dbr库的结构体标签应该如下所示: - 一对多关系: ``` type User struct { ID int64 `db:"id, primarykey, autoincrement"` Name string `db:"name"` Email string `db:"email"` Addresses []Address `db:"-"` } type Address struct { ID int64 `db:"id, primarykey, autoincrement"` UserID int64 `db:"user_id"` Street string `db:"street"` City string `db:"city"` Zip string `db:"zip"` } ``` 这里的 `Addresses` 字段使用了 `-` 标记,表示该字段不会被映射到数据库表中,只是用于在程序中表示该用户的地址列表。 - 一对一关系: ``` type User struct { ID int64 `db:"id, primarykey, autoincrement"` Name string `db:"name"` Email string `db:"email"` Address Address `db:"-"` } type Address struct { ID int64 `db:"id, primarykey, autoincrement"` UserID int64 `db:"user_id"` Street string `db:"street"` City string `db:"city"` Zip string `db:"zip"` } ``` 这里的 `Address` 字段也使用了 `-` 标记,表示该字段不会被映射到数据库表中,只是用于在程序中表示该用户的地址信息。 - 多对多关系: ``` type User struct { ID int64 `db:"id, primarykey, autoincrement"` Name string `db:"name"` Email string `db:"email"` Groups []Group `db:"-" dbr:"many2many:user_group"` } type Group struct { ID int64 `db:"id, primarykey, autoincrement"` Name string `db:"name"` Users []User `db:"-" dbr:"many2many:user_group"` } ``` 这里的 `Groups` 和 `Users` 字段都使用了 `-` 标记,表示这些字段不会被映射到数据库表中,只是用于在程序中表示用户和组的多对多关系。另外,`dbr:"many2many:user_group"` 标记表示用户和组之间的多对多关系需要通过 `user_group` 表来实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值