go语言中结构体tag使用

news2024/11/24 15:29:37

go中的tag在结构体中使用的。有两个作用:

(1)给结构体属性起别名,字段映射。对于不同类型的类型对应不同的值,比如xml,yaml,json等分别对应着不同的区域,当然标签也不同。比如json,bson,都是约定俗成的了。

(2)做属性判断和验证。

1.tag中的格式

(1)tag本身是一个字符串,字符串整个使用反引号``。

(2)key必须是非空字符串,不能使用双引号。字符串不能包含控制字符,空格,引号,冒号。

(3)value以双引号标记的字符串

(4)多个标签之间使用空格连接,标签名不需要使用双引号,标签名对应的值需要使用双引号,多个标签值需要使用逗号连接。

举例:

type User struct {
	UserId   int    `json:"user_id" bson:"b_user_id,bson_id"`
	UserName string `json:"user_name" bson:"b_user_name"`
}

注意:冒号前后不能有空格。

比如以下几个就是约定俗成的标签:bson,json,yaml,xml等,当然这个标签是可以自定义的

2.json,bson标签

type User struct { 
	ID       string `json:"id,omitempty" bson:"_id,omitempty"` 
	Username string `json:"username,omitempty" bson:"username,omitempty"` 
	Email    string `json:"email,omitempty" bson:"email,omitempty"` 
} 

比如以上代码,标签是为了起别名,只是每个标签作用的地方不一样。比如json前后端交互的时候用的多,比如请求和响应的都是json格式的数据。bson在和mongoDB数据库交互的时候使用的多。

json标签:使用了json标签,用于指定字段在json编码中的名称和行为,在与前端进行数据交互时,使用json标签可以确保字段在序列化为 JSON 数据时具有正确的名称和行为。

bson标签:使用了bson标签,bson标签是用于指定字段在 MongoDB 数据库中的名称和行为。当使用 MongoDB 数据库进行数据存储时,使用 bson标签可以确保字段在序列化和反序列化 BSON(Binary JSON)数据时具有正确的名称和行为。 

通过这些标签为字段起别名,可以在前端和数据库端建立字段映射,确保数据正确的传递和存储。

1. JSON 标签( json ): 
   - 在结构体字段上使用  json:"field_name"  标签,可以指定字段在 JSON 编码和解码中的别名和选项。 
   - 例如: UserName string  json:"user_name"   
   - 这样的标签可以指定在 JSON 编码和解码中使用 "user_name" 作为字段的别名。 
 
2. BSON 标签( bson ): 
   - 在结构体字段上使用  bson:"field_name"  标签,可以指定字段在 BSON 编码和解码中的别名和选项。 
   - 例如: UserName string  bson:"b_user_name"   
   - 这样的标签可以指定在 BSON 编码和解码中使用 "b_user_name" 作为字段的别名。 
 
3. YAML 标签( yaml ): 
   - 在结构体字段上使用  yaml:"field_name"  标签,可以指定字段在 YAML 编码和解码中的别名和选项。 
   - 例如: UserName string  yaml:"user_name"   
   - 这样的标签可以指定在 YAML 编码和解码中使用 "user_name" 作为字段的别名。 
 
4. XML 标签( xml ): 
   - 在结构体字段上使用  xml:"field_name"  标签,可以指定字段在 XML 编码和解码中的别名和选项。 
   - 例如: UserName string  xml:"user_name"   
   - 这样的标签可以指定在 XML 编码和解码中使用 "user_name" 作为字段的别名。 
 
需要注意的是,这些标签的具体含义和使用方式可能因使用的库或工具而有所不同。这些示例展示了在 Go 语言中使用不同标签的一般用法,但具体的实现可能会因库或工具的不同而有所区别。 
 
至于 YAML 和 XML 文件的读取,可以使用相应的库进行解析和处理。对于 YAML 文件,可以使用  gopkg.in/yaml.v2  包,对于 XML 文件,可以使用  encoding/xml  包或其他第三方包进行解析和处理。

3.举例

其实自己也可以想例子,以下案例作参考。

type Student struct {
	// 返回给前端的话,首字母大写很奇怪,所以给Name起了个别名
	Name string `json:"name"`
	Age  int    
}

func testTag() {
	s1 := Student{
		Name: "s1k",
	}
	bytes, err := json.Marshal(s1)
	if err != nil {
		panic(err)
	}
	// 将[]byte数组转换为string类型json类型
	//s := string(bytes)
	var s Student
	json.Unmarshal(bytes, &s)
	fmt.Printf("%v", s)
}

type User struct {
	UserId   int    `json:"user_id" bson:"b_user_id"`
	UserName string `json:"user_name" bson:"b_user_name"`
}

func testJson() {
	u := &User{
		UserId:   1,
		UserName: "tony",
	}

	fmt.Printf("%T", u)
	bytes, _ := json.Marshal(u)

	fmt.Println(string(bytes))

	// 通过反射获取标签的值
	// reflect.TypeOf(u),获取的是指针类型
	types := reflect.TypeOf(u)

	field := types.Elem().Field(0)
	fmt.Println(field.Tag.Get("json"))
	fmt.Println(field.Tag.Get("bson"))
}

type Http struct {
	Port   string `yaml:"port"`
	Secret string `yaml:"secretKey"`
	Domain string `yaml:"domain"`
}

type Config struct {
	Http `yaml:"http"`
}

func testYaml() {
	//var h Http
	config := new(Config)
	file, err := ioutil.ReadFile("config.yaml")
	if err != nil {
		fmt.Println(err.Error())
	}
	// 将解析后的数据存储到结构体中
	err = yaml.Unmarshal(file, config)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(config.Http, " ", config.Port, " ", config.Secret, " ", config.Domain)
}

type Person struct {
	Name string `json:"name"`
	Age  string `json:"age,omitempty"` //有 omitempty 属性,因此 encoding/json 在将对象转化 json 字符串时,
	// 只要发现对象里的 Addr 为 false, 0, 空指针,空接口,空数组,空切片,空映射,空字符串中的一种,就会被忽略。
}

func testTags() {
	p1 := &Person{
		Name: "zhangsan",
	}
	// 所以空字符串就会被忽略
	bytes, _ := json.Marshal(p1)
	fmt.Printf("%s", bytes)
	fmt.Println(p1)
	fmt.Printf("%T", p1)

	p2 := &Person{
		Name: "lisi",
		Age:  "15",
	}
	fmt.Println(p2)
}

// 从结构体中取出tag,通过反射
/*
获取字段 field
获取标签 tag
获取键值对 key:value

// 三种获取 field
field := reflect.TypeOf(obj).FieldByName("Name")
field := reflect.ValueOf(obj).Type().Field(i)  // i 表示第几个字段
field := reflect.ValueOf(&obj).Elem().Type().Field(i)  // i 表示第几个字段

// 获取 Tag
tag := field.Tag

// 获取键值对
labelValue := tag.Get("label")
labelValue,ok := tag.Lookup("label")
*/
func getTag() {
	p2 := &Person{
		Name: "lisi",
		Age:  "15",
	}
	// 三种方式获取Field
	field := reflect.ValueOf(p2).Elem().Type().Field(1)
	getName := field.Tag.Get("json")
	// 获取tag

	//value, ok := tag.Lookup("name")
	fmt.Println(getName)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1071398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运行在移动设备上的ML机器学习任务——基于MediaPipe的手势识别

前期的文章我们介绍了MediaPipe的人手关键点检测。其检测的21个点的坐标位置如下: 当检测到其关键点后,我们就可以利用此关键点来进行人手手势识别。MediaPipe 手势识别器任务可实时识别手势,并提供识别的手势结果。我们可以使用此任务来识别用户的特定手势,并调用与这些手…

用python写代码:pip list,列出:pip install 库1 库2库3...,方便一次性安装错误

彻底解决pip安装库问题 用python写代码:pip list 列出:pip install 库1 库2 库3 这种输出以下是使用Python编写代码来实现类似pip list和pip install package1 package2 package3输出的示例: import pkg_resources# 列出已安装的包和版本 i…

LLMs 库尔贝克-莱布勒散度 KL Kullback-Leibler Divergence

KL-散度,或称为库尔巴克-莱布勒散度,是在强化学习领域经常遇到的概念,特别是在使用Proximal Policy Optimization(PPO)算法时。它是两个概率分布之间差异的数学度量,帮助我们了解一个分布与另一个分布的差异…

BGP在运营商专线业务下的部署

1. 为什么说BGP是网工的分水岭? 2. BGP的路由黑洞如何产生? 3. BGP协议在什么场景下使用? --- BGP - 边界网关协议 - 一种动态路由协议 --- 路由协议 - 运行在路由器上的软件 - 路由器和路由器彼此之间交换路由信息 --- 同步路…

YOLOv5入门实践(1)— 基础环境介绍及搭建

前言:Hello大家好,我是小哥谈。YOLOv5基础知识入门系列和YOLOv5源码中的参数超详细解析系列学习完成之后,接着就进入YOLOv5入门实践系列了。为了让大家能够清楚地了解如何用YOLOv5去进行实践,本篇文章就简单给大家介绍一下YOLOv5基…

红队专题-从零开始VC++远程控制软件RAT-C/S-[2]界面编写及上线

红队专题 招募六边形战士队员1.课前回顾unicode编码 字符串 2.界面编程(下)对话框重载消息函数更改对话框同步更改 3.服务端上线,下线,以及客户端的资源销毁(上)添加socket 变量添加 socket 消息填补config信息创建线程函数 并运行添加Addhost添加 getIt…

C盘或用户名文件夹变成桌面后改不回去问题解决

问题:为了给C盘腾出空间,会把桌面文件夹移动到别的盘。系统自带的功能使得右击这些文件夹,属性,位置里就可以简单完成移动。 然而看似简单的操作依旧有不少人弄出问题。比如: 把桌面文件夹移动到某盘根目录&#xff0…

Python开源项目周排行 2023年第35周

#2023年第35周2023年10月3日1vizro一个用于创建模块化数据可视化应用程序的工具包。在几分钟内快速自助组装定制仪表板 - 无需高级编码或设计经验 - 创建灵活且可扩展、支持 Python 的数据可视化应用程序。使用几行简单的配置来创建复杂的仪表板,这些仪表板是利用 P…

ElfBoard,为嵌入式学习爱好者创造更具价值的学习体验

ElfBoard是飞凌嵌入式面向学习者推出的全新子品牌,旨在为嵌入式学习爱好者创造更具价值的学习体验。 ELF是"Embedded Learning Fans"嵌入式学习爱好者的首字母缩写,同时ELF也是“精灵”的意思,ElfBoard以灵动的精灵形象作为品牌Lo…

公安机关警务vr综合实战模拟训练提高团队合作能力

公安出警VR虚拟仿真培训软件是VR公司利用VR虚拟现实和web3d开发技术,对警务执法过程中可能发生的各种场景进行还原、模拟、演练,结合数据分析,实施量化考核,提高学员的心理承压、应急处突、遇袭反应和临危处置综合能力。 公安出警…

什么是 SRE?一文详解 SRE 运维体系

目录 可观测性系统 故障响应 故障复盘 测试与发布 容量规划 自动化工具开发 用户体验 可观测性系统 在任何有一定规模的企业内部,一旦推行起来整个SRE的运维模式,那么对于可观测性系统的建设将变得尤为重要,而在整个可观测性系统中&a…

QT:工业软件开发的首选“

QT:工业软件开发的首选,强大的GUI框架与多功能扩展" 在工业软件开发领域,主要从事自动化、机械自动化和电气自动化的人员通常使用C或C作为主要编程语言。然而,在当今互联网发展的背景下,Qt成为了C中唯一可靠的G…

项目成员积分规则

在当下的项目/团队管理种,如何让成员能清晰的看到,自己的工作、努力在团队种属于那个段位,通过这个形式,并配合其他方式去点燃成员的进步之心。以积分的形式,代替绩效考核,一些零散的想法,欢迎各…

使用Jenkins自动化部署项目

Jenkins的同类产品 Jenkins 是一款功能强大的开源持续集成/持续交付 (CI/CD) 工具,但也有一些替代品可供选择,以下是其中一些: Travis CI:Travis CI 是另一款流行的持续集成工具,可与 GitHub 集成,支持多种…

国庆前花2个月面过阿里测开岗,要个27K也不过分吧?

背景介绍 美本计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三暑假回国的时间比较短(小于两个月),于是找的实…

SAP-MM-库存数量查询

想要查看整个工厂下的库存数量,例如普通库存、特殊库存,可以用MB52查看,但是导出的表格 不是ALV格式的,比较难用,而且导出的也不全是特殊库存,普通库存也被导出来了。 例如现在只想导出销售订单库存SE16N&a…

国庆回来面了个阿里拿27k出来的小哥,让我见识到了什么是天花板...

2023年堪称大学生就业最难的一年,应届毕业生人数是1076万。失业率超50%! 但是我观察到一个数据,那就是已经就业的毕业生中,计算机通信等行业最受毕业生欢迎! 计算机IT行业薪资高,平均薪资是文科其他岗位的3…

阿里云使用https获取git地址注意事项

首先是使用账号密码登录阿里云,这个账号可以使用手机号或者第三方账号注册。登录之后去下图所示地方复制 https 地址。进行拉取代码 使用https拉取代码时候,会让你重新输入一个阿里云的账号密码。如果是重新注册的账号,切记需要先去设置一下h…

Unity设计模式——原型模式

原型模式(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节 。 原型类 Prototype: abstract class P…

【python】可视化-绘制带有边权重的无向图

文章目录 需求示例数据代码实现 需求 输入数据表(矩阵),绘制无向图。 示例数据 **示例数据1:**3个特征之间的关系数据 (data1.txt) featuresfeature1feature2feature3feature110.60.8feature20.610.3feature30.80.31 **示例数据2:**4个特…