1. 前言

Go的struct声明允许字段附带Tag来对字段做一些标记。

Tag不仅仅是一个字符串那么简单,因为其主要用于反射场景,reflect包中提供了操作Tag的方法,所以Tag写法也要遵循一定的规则。

2. Tag的本质

2.1 Tag规则

Tag本身是一个字符串,但字符串中却是:以空格分隔的 key:value 对

  • key: 必须是非空字符串,字符串不能包含控制字符、空格、引号、冒号。
  • value: 以双引号标记的字符串
  • 注意:冒号前后不能有空格

如下代码所示,如此写没有实际意义,仅用于说明Tag规则

type Server struct {ServerName string `key1: "value1" key11:"value11"`ServerIP   string `key2: "value2"`
}

上述代码ServerName字段的Tag包含两个key-value对。ServerIP字段的Tag只包含一个key-value对。

2.2 Tag是Struct的一部分

前面说过,Tag只有在反射场景中才有用,而反射包中提供了操作Tag的方法。在说方法前,有必要先了解一下Go是如何管理struct字段的。

以下是reflect包中的类型声明,省略了部分与本文无关的字段。

// A StructField describes a single field in a struct.
type StructField struct {// Name is the field name.Name string...Type      Type      // field typeTag       StructTag // field tag string...
}type StructTag string

可见,描述一个结构体成员的结构中包含了StructTag,而其本身是一个string。也就是说Tag其实是结构体字段的一个组成部分。

2.3 获取Tag

StructTag提供了Get(key string) string方法来获取Tag,示例如下:

package mainimport ("reflect""fmt"
)type Server struct {ServerName string `key1:"value1" key11:"value11"`ServerIP   string `key2:"value2"`
}func main() {s := Server{}st := reflect.TypeOf(s)field1 := st.Field(0)fmt.Printf("key1:%v\n", field1.Tag.Get("key1"))fmt.Printf("key11:%v\n", field1.Tag.Get("key11"))filed2 := st.Field(1)fmt.Printf("key2:%v\n", filed2.Tag.Get("key2"))
}

程序输出如下:

key1:value1
key11:value11
key2:value2

3. Tag存在的意义

本文示例中tag没有任何实际意义,这是为了阐述tag的定义与操作方法,也为了避免与你之前见过的诸如json:xxx混淆。

使用反射可以动态的给结构体成员赋值,正是因为有tag,在赋值前可以使用tag来决定赋值的动作。
比如,官方的encoding/json包,可以将一个JSON数据Unmarshal进一个结构体,此过程中就使用了Tag。该包定义一些规则,只要参考该规则设置tag就可以将不同的JSON数据转换成结构体。

总之:正是基于struct的tag特性,才有了诸如json、orm等等的应用。理解这个关系是至关重要的。或许,你可以定义另一种tag规则,来处理你特有的数据。

4. Tag常见用法

常见的tag用法,主要是JSON数据解析、ORM映射等。

golang 的 tag相关推荐

  1. [Golang] struct Tag说明

    在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如 type User struct {UserId int `json:"user ...

  2. mysql表结构 转 golang 结构体struct

    在线转 https://dev.ataotaoa.com 本地转换(推荐) github地址: https://github.com/gohouse/converter 下载地址: https://g ...

  3. SQLAlchemy学习教程

    简介 简单来说就是讲类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果! 最容易入门的情况,如果有一张用户表,这个表里面是记录的所有用户的信息,包含名字.年龄.性别.这是数据表的基本情况 ...

  4. golang 结构体struct 标签tag 标记 `` 简介

    从一个例子说起 我们经常会碰到下面格式的struct定义: type Person struct {Name string `json:"name"`Age int `json:& ...

  5. golang 得到 结构体 struct 标签 tag 内容 结构体中的``数据

    goLang获取struct的tag内容:beego的ORM中也通过tag来定义参数的. 获取tag的内容是利用反射包来实现的.示例代码如下: package main import ("f ...

  6. golang获取结构体中的tag_26. Go 语言中结构体的 Tag 用法

    大家好,我是明哥. 由于某些不可抗力,之前该专栏的所有内容都被删除了.因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒. 本文原文:http://golang.iswbm.com ...

  7. protobuf导出golang,调整默认tag的方法

    转载地址:https://studygolang.com/articles/28563 protobuf导出golang,调整默认tag的方法 问题概述 在protobuf导出到golang的时候,生 ...

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

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

  9. golang API json,struct结构中标签(Tag)的使用

    在看别人的一些代码时,声明结构时有个json:name是做什么用的? 想知道原因得了解下: 在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用.但是由经常需 ...

最新文章

  1. 如何用ActionScript制作绚丽的特效——Silk
  2. IOS UINavigationController use
  3. MySql外键学习总结
  4. jquery设置表单元素只读_jquery设置元素readonly与disabled属性
  5. 【POJ - 2632】Crashing Robots(模拟)
  6. 约瑟夫斯问题-java版数组解法和链表解法
  7. python函数中文手册-python函数手册
  8. 简易呼吸灯c语言程序,呼吸灯 - 单片机教程 - C语言网
  9. 2020软考程序员考试大纲要求的必会单词
  10. “智”在这里,图扑软件解码智慧选煤厂
  11. highcharts 解决数据提示框展示的内容太多 ,部分内容无法显示的问题
  12. 《嵌入式 – GD32开发实战指南》第13章 DAC
  13. 黄金矿工~java小游戏【内含源码】
  14. FPGA--有限状态机(FSM)的设计
  15. 任务管理器不显示磁盘
  16. Hello!树先生 (2011)
  17. PostgreSQL 11 与 pgAdmin4 在 Windows 平台上的安装和使用
  18. php实现图片背景换色功能
  19. 单台 MySQL 支撑不了这么多的并发请求,我们该怎么办?
  20. 云环境渗透测试的重要性

热门文章

  1. echarts map 点击地图区域变色_pyecharts 地图可视化
  2. css 商城 两列_css大法之使用伪元素实现超实用的图标库(附源码
  3. python办公自动化博客_最全总结 | 聊聊 Python 办公自动化之 Word(下)
  4. html文本格式化意思,HTML文本格式化标签(Formatting)
  5. java+connect+time+out_聊聊jdk httpclient的connect timeout异常
  6. 浏览器图片解析失败(裂开,空白)排查思路
  7. 2018-08-03北大青鸟S1结业 项目MyKTV的总结
  8. Android Studio:解决DataBinding v4包问题
  9. LVM源码分析2-libdaemon
  10. RSync服务器配置