[Golang] struct Tag说明
在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。形如
type User struct {UserId int `json:"user_id" bson:"user_id"`UserName string `json:"user_name" bson:"user_name"` }
struct成员变量标签(Tag)说明
要比较详细的了解这个,要先了解一下golang的基础,在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用。但是由经常需要和其它的系统进行数据交互,例如转成json格式,存储到mongodb啊等等。这个时候如果用属性名来作为键值可能不一定会符合项目要求。
所以呢就多了小米点的内容,在golang中叫标签(Tag),在转换成其它数据格式的时候,会使用其中特定的字段作为键值。例如上例在转成json格式:
u := &User{UserId: 1, UserName: "tony"} j, _ := json.Marshal(u) fmt.Println(string(j)) // 输出内容:{"user_id":1,"user_name":"tony"}
如果在属性中不增加标签说明,则输出:
{"UserId":1,"UserName":"tony"}
可以看到直接用struct的属性名做键值。
其中还有一个bson的声明,这个是用在将数据存储到mongodb使用的。
struct成员变量标签(Tag)获取
那么当我们需要自己封装一些操作,需要用到Tag中的内容时,如何去获取呢?这边可以使用反射包(reflect)中的方法来获取:
t := reflect.TypeOf(u) field := t.Elem().Field(0) fmt.Println(field.Tag.Get("json")) fmt.Println(field.Tag.Get("bson"))
完整代码如下:
package mainimport ("encoding/json""fmt""reflect" )func main() {type User struct {UserId int `json:"user_id" bson:"user_id"`UserName string `json:"user_name" bson:"user_name"`}// 输出json格式u := &User{UserId: 1, UserName: "tony"}j, _ := json.Marshal(u)fmt.Println(string(j))// 输出内容:{"user_id":1,"user_name":"tony"}// 获取tag中的内容t := reflect.TypeOf(u)field := t.Elem().Field(0)fmt.Println(field.Tag.Get("json"))// 输出:user_idfmt.Println(field.Tag.Get("bson"))// 输出:user_id
beego的ORM中也通过tag来定义参数的。
package mainimport ("fmt""reflect" )type Job struct {AlarmStatus *string `json:"alarm_status" name:"alarm_status"`CPUTopology string `json:"cpu_topology" name:"cpu_topology"` }func main(){a := "abc"s := Job{&a,"hello"}st := reflect.TypeOf(s)field := st.Field(1)fmt.Println(field.Tag.Get("json"), field.Tag.Get("name")) }
package main import ("fmt""reflect" // 这里引入reflect模块 )type User struct {Name string "user name" //这引号里面的就是tagPasswd string "user passsword" }func main() {user := &User{"chronos", "pass"}s := reflect.TypeOf(user).Elem() //通过反射获取type定义for i := 0; i < s.NumField(); i++ {fmt.Println(s.Field(i).Tag) //将tag输出出来} }
[Golang] struct Tag说明相关推荐
- golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)
文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...
- golang mysql 自动建表_mysql表结构自动生成golang struct
a lib for golang , generate mysql table schema to golang struct mysql表结构自动生成golang struct github地址 安 ...
- Go语言之 Struct Tag
在上一篇介绍Go反射的时候,提到了如何通过反射获取Struct的Tag,这一篇文章主要就是介绍这个的使用和原理,在介绍之前我们先看一下JSON字符串和Struct类型相互转换的例子. JSON字符串对 ...
- U-boot给kernel传参数和kernel读取参数—struct tag
U-boot 会给 Linux Kernel 传递很多参数,如:串口, RAM , videofb 等. 而 Linux kernel 也会读取和处理这些参数.两者之间 通过 struct tag 来 ...
- Golang struct 指针引用用法(声明入门篇)
Golang struct 指针引用用法 一.前言 入门篇,只包括声明内容,基础的赋值 和 修改值. 个人总结:在 变量访问 struct 结构体时,共有5种不同的方式定义 指针结构体. 个人术语: ...
- golang struct json map 互相转化
目录 一.Json和struct互换 (1)Json转struct例子 (2)struct转json 二.json和map互转 (1)json转map例子 (2)map转Json例子 三.map和st ...
- golang struct 切片数组去重
目录 实例1 实例2 适配多个切片类型 实例1 type Fts_message_table_content_nomal struct {Docid int64 `xorm:"docid&q ...
- golang struct 转map 及 map[string]*Struct 初始化和遍历
package mainimport ("encoding/json""errors""fmt""reflect"&qu ...
- golang 的 tag
1. 前言 Go的struct声明允许字段附带Tag来对字段做一些标记. 该Tag不仅仅是一个字符串那么简单,因为其主要用于反射场景,reflect包中提供了操作Tag的方法,所以Tag写法也要遵循一 ...
最新文章
- 2021-11-04Oracle19c 图形化安装,在windoes上)
- sql 导航函数 lead
- eclipse+pydev快捷键
- ICML 2018 | 腾讯AI Lab详解16篇入选论文
- git 安装包_Git、TortoiseGit的安装、使用说明
- android应用对于内存的大小是有限制的,Android 的内存限制
- 为什么美团全面推动 K8S 落地,咬紧牙关也要搞云原生?
- c++驱动键鼠源码_Android移植FM芯片RDA5807M驱动指导
- 配置用户组策略环回处理模式
- pytorch 入门学习使用逻辑斯蒂做二分类-6
- 系统学习NLP(十六)--DSSM
- C#在线预览文档(word,excel,pdf,txt,png)
- DirectFB 之 FillRectangle 绘制矩形
- DisplayX显示器测试、显示器屏幕检测
- 2019.04.14_16.1 - 17.5
- ESP8266-Arduino编程实例-L3G4200D三轴陀螺仪驱动
- tar 打包隐藏文件
- 最新GEP分销系统网站源码官方
- Handler到底是一个什么东东
- 一款原型设计工具“墨刀”的介绍
热门文章
- Scala学习(十二)高阶函数
- CentOS7 安装 webgoat 7.1 简介
- Python爬虫实战之(五)| 模拟登录wechat 1
- 查看Linux服务器的CPU详细信息
- javascript图片轮播(完全自己手写代码)
- 三星1TB硬盘MM804RS不识别加电磁头打盘敲盘异响不识别开盘恢复数据
- Logistic 回归(sigmoid函数,手机的评价,梯度上升,批处理梯度,随机梯度,从疝气病症预测病马的死亡率...
- Struts2 Date类型转换问题
- 正则基础之 NFA引擎匹配原理
- java excel解析视频教程_java解析Excel(xls、xlsx两种格式)