golang 结构体标签 struct tag

Golang 可以为结构体的字段添加 tag,类似注释,用反引号``

例:

const tagName = "validate"
type employee struct {
	ID     int     `json:"id"`
	Name   string  `json:"名字" validate:"presence,min=2,max=40"`
	Age    int     `json:"年龄"`
	Desc   string  `json:"描述" back:"好看否"`
	weight float64 `json:"weight" 单位:"kg"`
	Salary float64 `json:"-"`
	Email string `validate:"email,required"`
	MateName string `json:"mate_name,omitempty"`
}

转为json类型时

zhangsan := employee{
		ID:     1,
		Name:   "张三",
		Age:    18,
		Desc:   "秀色可餐",
		weight: 48.0,
		Salary: 12.0,
		MateName:"Prince",
	}

	fmt.Println(zhangsan)
	re,_:=json.Marshal(zhangsan)
	fmt.Println(string(re))

	t:=reflect.TypeOf(zhangsan)

	fmt.Println("Type: ",t.Name())
	fmt.Println("Kind: ",t.Kind())
	fmt.Println(t.NumField())

在这里插入图片描述
说明:转换为json格式时,tag中

json第一个参数为 转为json后字段的名字

ID-id
Name-名字
Age- 年龄

结构体字段为小学字母则不转换

weight 没有转换

josn加‘-’不转换

Salary float64 `json:"-"` 不 转换

json:",omitempty"

我的感觉是字段有值则不忽略,没有值则忽略

zhangsan := employee{
   	ID:     1,
   	Name:   "张三",
   	Age:    18,
   	Desc:   "秀色可餐",
   	weight: 48.0,
   	Salary: 12.0,
   	//MateName:"Prince",
   }
   结果:
   {"id":1,"名字":"张三","年龄":18,"描述":"秀色可餐","Email":""}

反射机制

zhangsan := employee{
		ID:     1,
		Name:   "张三",
		Age:    18,
		Desc:   "秀色可餐",
		weight: 48.0,
		Salary: 12.0,
		MateName:"Prince",
	}
	t:=reflect.TypeOf(zhangsan)

	fmt.Println("Type: ",t.Name())
	fmt.Println("Kind: ",t.Kind())
	fmt.Println(t.NumField())

	for i:=0;i<t.NumField();i++{
		field:=t.Field(i)
		tag:=field.Tag.Get(tagName)
		fmt.Printf("%d. %v(%v), tag:'%v'\n", i+1, field.Name, field.Type.Name(), tag)

在这里插入图片描述

通过reflect包我们能够获取结构体的基本信息,包括它的类型、种类且能列出它的所有字段。field.Tag.Get方法返回与标签名匹配的字符串,你可以自由使用做你想做的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用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` 表来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值