在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。形如

  1. type User struct {
  2. UserId int `json:"user_id" bson:"user_id"`
  3. UserName string `json:"user_name" bson:"user_name"`
  4. }

struct成员变量标签(Tag)说明

要比较详细的了解这个,要先了解一下golang的基础,在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用。但是由经常需要和其它的系统进行数据交互,例如转成json格式,存储到mongodb啊等等。这个时候如果用属性名来作为键值可能不一定会符合项目要求。

所以呢就多了小米点的内容,在golang中叫标签(Tag),在转换成其它数据格式的时候,会使用其中特定的字段作为键值。例如上例在转成json格式:

  1. u := &User{UserId: 1, UserName: "tony"}
  2. j, _ := json.Marshal(u)
  3. fmt.Println(string(j))
  4. // 输出内容:{"user_id":1,"user_name":"tony"}

如果在属性中不增加标签说明,则输出:

  1. {"UserId":1,"UserName":"tony"}

可以看到直接用struct的属性名做键值。

其中还有一个bson的声明,这个是用在将数据存储到mongodb使用的。

struct成员变量标签(Tag)获取

那么当我们需要自己封装一些操作,需要用到Tag中的内容时,如何去获取呢?这边可以使用反射包(reflect)中的方法来获取:

  1. t := reflect.TypeOf(u)
  2. field := t.Elem().Field(0)
  3. fmt.Println(field.Tag.Get("json"))
  4. fmt.Println(field.Tag.Get("bson"))

完整代码如下:

  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "reflect"
  7. )
  8.  
  9. func main() {
  10. type User struct {
  11. UserId int `json:"user_id" bson:"user_id"`
  12. UserName string `json:"user_name" bson:"user_name"`
  13. }
  14. // 输出json格式
  15. u := &User{UserId: 1, UserName: "tony"}
  16. j, _ := json.Marshal(u)
  17. fmt.Println(string(j))
  18. // 输出内容:{"user_id":1,"user_name":"tony"}
  19.  
  20. // 获取tag中的内容
  21. t := reflect.TypeOf(u)
  22. field := t.Elem().Field(0)
  23. fmt.Println(field.Tag.Get("json"))
  24. // 输出:user_id
  25. fmt.Println(field.Tag.Get("bson"))
  26. // 输出:user_id

beego的ORM中也通过tag来定义参数的。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "reflect"
  6. )
  7.  
  8. type Job struct {
  9. AlarmStatus *string `json:"alarm_status" name:"alarm_status"`
  10. CPUTopology string `json:"cpu_topology" name:"cpu_topology"`
  11. }
  12.  
  13. func main(){
  14. a := "abc"
  15. s := Job{&a,"hello"}
  16. st := reflect.TypeOf(s)
  17. field := st.Field(1)
  18. fmt.Println(field.Tag.Get("json"), field.Tag.Get("name"))
  19. }
  1. package main
  2. import (
  3. "fmt"
  4. "reflect" // 这里引入reflect模块
  5. )
  6.  
  7. type User struct {
  8. Name string "user name" //这引号里面的就是tag
  9. Passwd string "user passsword"
  10. }
  11.  
  12. func main() {
  13. user := &User{"chronos", "pass"}
  14. s := reflect.TypeOf(user).Elem() //通过反射获取type定义
  15. for i := 0; i < s.NumField(); i++ {
  16. fmt.Println(s.Field(i).Tag) //将tag输出出来
  17. }
  18. }

[Golang] struct Tag说明的更多相关文章

  1. golang struct tag

    golang可以在struct中的每个字段,写上一个tag.这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化 package main import ( "enc ...

  2. Golang Struct 声明和使用

    Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...

  3. 引用 U-boot给kernel传参数和kernel读取参数—struct tag

    引用 清风徐徐 的 U-boot给kernel传参数和kernel读取参数—struct tag U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等.而Linux ...

  4. 【linux】U-BOOT与linux kernel通信: struct tag

      欢迎转载,转载时需保留作者信息. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://b ...

  5. Go语言中的struct tag

    有时在Go的结构体定义时会看到这样的形式: type User struct { UserId int `json:"user_id" bson:"b_user_id&q ...

  6. 使用 Go 的 struct tag 来解析版本号字符串

    各类软件的版本号定义虽然都不尽相同,但是其基本原理基本上还是相通的:通过特写的字符对字符串进行分割.我们把这一规则稍作整理,放到 struct tag 中,告诉解析器如何解析,下面就以 semver ...

  7. golang struct 定义中json``解析说明

    在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下 package main import ( "enco ...

  8. golang struct的使用

    Go struct tag深入理解 喜欢本站的朋友可以收藏本站,或者加入QQ群:172816590,我们大家一起来交流技术! 欢迎来到梁钟霖个人博客网站.本个人博客网站提供最新的站长新闻,各种互联网资 ...

  9. Go struct tag

    struct成员变量标签(Tag)说明 要比较详细的了解这个,要先了解一下golang的基础,在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用.但是由经常 ...

随机推荐

  1. SRM478

    又是rng_58的神题.. 250pt: 题意:给定一个初始数x,对于这个数可以进行x*4+3,或者x*8+7的操作.最多进行100000次操作 问最少经过几次出现%1000000007 == 0的情 ...

  2. zoj2607

    题意:如左图,给定A,B,C,D的面积分别为大于等于a,b,c,d,求最小的面积 思路:因为a,b肯定有一个是满的(不然还可压缩到更小),同理,ac,bd,cd都只有一个是满的,所以有可能是对角满的, ...

  3. 数字证书管理工具openssl和keytool的区别

    1. 用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器 ...

  4. Sql Server Report 导出到EXCEL 指定行高

    在SQL SERVER REPORT 2005做报表的时候,发现在report中指定的行高没有用.google了一下,找到了解决方法. Make both CanGrow and CanShrink ...

  5. Grid++Report报表工具C/S实战篇(五)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第五部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  6. Loop List

    Loop List is very common in interview. This article we give a more strict short statement about its ...

  7. 「PKUSC2018」真实排名(排列组合,数学)

    前言 为什么随机跳题会跳到这种题目啊? Solution 我们发现可以把这个东西分情况讨论: 1.这个点没有加倍 这一段相同的可以看成一个点,然后后面的都可以. 这一段看成一个点,然后前面的不能对他造 ...

  8. adb shell pm list packages的用法

    abd shell pm list packages     ####查看当前连接设备或者虚拟机的所有包 adb shell pm list packages -d    #####只输出禁用的包. ...

  9. 通过DHCP动态管理IP地址

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...

  10. maven项目无法新增java test目录的问题

    有时候当我们构建好maven项目时,再导入eclipse中会缺少src/main/java  和src/test/java,这是需要我们手动创建: 但是有时候在 项目视图下或者 enterprise ...