在处理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说明相关推荐

  1. golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)

    文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...

  2. golang mysql 自动建表_mysql表结构自动生成golang struct

    a lib for golang , generate mysql table schema to golang struct mysql表结构自动生成golang struct github地址 安 ...

  3. Go语言之 Struct Tag

    在上一篇介绍Go反射的时候,提到了如何通过反射获取Struct的Tag,这一篇文章主要就是介绍这个的使用和原理,在介绍之前我们先看一下JSON字符串和Struct类型相互转换的例子. JSON字符串对 ...

  4. U-boot给kernel传参数和kernel读取参数—struct tag

    U-boot 会给 Linux Kernel 传递很多参数,如:串口, RAM , videofb 等. 而 Linux kernel 也会读取和处理这些参数.两者之间 通过 struct tag 来 ...

  5. Golang struct 指针引用用法(声明入门篇)

    Golang struct 指针引用用法 一.前言 入门篇,只包括声明内容,基础的赋值 和 修改值. 个人总结:在 变量访问 struct 结构体时,共有5种不同的方式定义 指针结构体. 个人术语: ...

  6. golang struct json map 互相转化

    目录 一.Json和struct互换 (1)Json转struct例子 (2)struct转json 二.json和map互转 (1)json转map例子 (2)map转Json例子 三.map和st ...

  7. golang struct 切片数组去重

    目录 实例1 实例2 适配多个切片类型 实例1 type Fts_message_table_content_nomal struct {Docid int64 `xorm:"docid&q ...

  8. golang struct 转map 及 map[string]*Struct 初始化和遍历

    package mainimport ("encoding/json""errors""fmt""reflect"&qu ...

  9. golang 的 tag

    1. 前言 Go的struct声明允许字段附带Tag来对字段做一些标记. 该Tag不仅仅是一个字符串那么简单,因为其主要用于反射场景,reflect包中提供了操作Tag的方法,所以Tag写法也要遵循一 ...

最新文章

  1. 2021-11-04Oracle19c 图形化安装,在windoes上)
  2. sql 导航函数 lead
  3. eclipse+pydev快捷键
  4. ICML 2018 | 腾讯AI Lab详解16篇入选论文
  5. git 安装包_Git、TortoiseGit的安装、使用说明
  6. android应用对于内存的大小是有限制的,Android 的内存限制
  7. 为什么美团全面推动 K8S 落地,咬紧牙关也要搞云原生?
  8. c++驱动键鼠源码_Android移植FM芯片RDA5807M驱动指导
  9. 配置用户组策略环回处理模式
  10. pytorch 入门学习使用逻辑斯蒂做二分类-6
  11. 系统学习NLP(十六)--DSSM
  12. C#在线预览文档(word,excel,pdf,txt,png)
  13. DirectFB 之 FillRectangle 绘制矩形
  14. DisplayX显示器测试、显示器屏幕检测
  15. 2019.04.14_16.1 - 17.5
  16. ESP8266-Arduino编程实例-L3G4200D三轴陀螺仪驱动
  17. tar 打包隐藏文件
  18. 最新GEP分销系统网站源码官方
  19. Handler到底是一个什么东东
  20. 一款原型设计工具“墨刀”的介绍

热门文章

  1. Scala学习(十二)高阶函数
  2. CentOS7 安装 webgoat 7.1 简介
  3. Python爬虫实战之(五)| 模拟登录wechat 1
  4. 查看Linux服务器的CPU详细信息
  5. javascript图片轮播(完全自己手写代码)
  6. 三星1TB硬盘MM804RS不识别加电磁头打盘敲盘异响不识别开盘恢复数据
  7. Logistic 回归(sigmoid函数,手机的评价,梯度上升,批处理梯度,随机梯度,从疝气病症预测病马的死亡率...
  8. Struts2 Date类型转换问题
  9. 正则基础之 NFA引擎匹配原理
  10. java excel解析视频教程_java解析Excel(xls、xlsx两种格式)