Go语言结构体标签(Struct Tag)


本站和网页 http://c.biancheng.net/view/112.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Go语言结构体标签(Struct Tag)
首页
教程
VIP会员
一对一答疑
辅导班
公众号
首页
C语言教程
C++教程
Python教程
Java教程
Linux入门
更多>>
目录
Go语言
Go语言简介
Go语言基本语法
Go语言容器
流程控制
Go语言函数
Go语言结构体
Go语言接口
Go语言包(package)
Go语言并发
10 Go语言反射 10.1 Go语言反射(reflection)10.2 Go语言反射规则浅析10.3 反射——性能和灵活性的双刃剑10.4 通过反射获取类型信息10.5 通过反射获取指针指向的元素类型10.6 通过反射获取结构体的成员类型10.7 Go语言结构体标签10.8 通过反射获取值信息10.9 通过反射访问结构体成员的值10.10 判断反射值的空和有效性10.11 通过反射修改变量的值10.12 通过类型信息创建实例10.13 通过反射调用函数10.14 Go语言inject库:依赖注入
11
Go语言文件处理
12
Go语言编译与工具
首页 > Go语言 > Go语言反射
Go语言结构体标签(Struct Tag)
通过 reflect.Type 获取结构体成员信息 reflect.StructField 结构中的 Tag 被称为结构体标签(Struct Tag)。结构体标签是对结构体字段的额外信息标签。
JSON、BSON 等格式进行序列化及对象关系映射(Object Relational Mapping,简称 ORM)系统都会用到结构体标签,这些系统使用标签设定字段在处理时应该具备的特殊属性和可能发生的行为。这些信息都是静态的,无须实例化结构体,可以通过反射获取到。
提示
结构体标签(Struct Tag)类似于 C# 中的特性(Attribute)。C# 允许在类、字段、方法等前面添加 Attribute,然后在反射系统中可以获取到这个属性系统。例如:
[Conditional("DEBUG")]
public static void Message(string msg)
Console.WriteLine(msg);
结构体标签的格式
Tag 在结构体字段后方书写的格式如下:
`key1:"value1" key2:"value2"`
结构体标签由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。键值对之间使用一个空格分隔。
从结构体标签中获取值
StructTag 拥有一些方法,可以进行 Tag 信息的解析和提取,如下所示:
func(tag StructTag)Get(key string)string
根据 Tag 中的键获取对应的值,例如 `key1:"value1"key2:"value2"` 的 Tag 中,可以传入“key1”获得“value1”。
func(tag StructTag)Lookup(key string)(value string,ok bool)
根据 Tag 中的键,查询值是否存在。
结构体标签格式错误导致的问题
编写 Tag 时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,参见下面这个例子:
package main
import (
"fmt"
"reflect"
func main() {
type cat struct {
Name string
Type int `json: "type" id:"100"`
typeOfCat := reflect.TypeOf(cat{})
if catType, ok := typeOfCat.FieldByName("Type"); ok {
fmt.Println(catType.Tag.Get("json"))
代码输出空字符串,并不会输出期望的 type。
第 12 行中,在json:和"type"之间增加了一个空格。这种写法没有遵守结构体标签的规则,因此无法通过 Tag.Get 获取到正确的 json 对应的值。
这个错误在开发中非常容易被疏忽,造成难以察觉的错误。
关注公众号「站长严长生」,在手机上阅读所有教程,随时随地都能学习。本公众号由C语言中文网站长亲自运营,长期更新,坚持原创。
微信扫码关注公众号
优秀文章
C++获取字符串长度详解
C语言static变量和函数
Shell [[]]详解:检测某个条件是否成立
哈夫曼编码(包含C语言实现代码)
Linux绝对路径和相对路径
Java DriverManager.getConnection()方法:获取数据库连接
MySQL系统变量(查看和修改)
Spring MVC视图解析器(ViewResolver)
<sql:update>标签
JS Array(数组)对象
精美而实用的网站,分享优质编程教程,帮助有志青年。千锤百炼,只为大作;精益求精,处处斟酌;这种教程,看一眼就倾心。
关于网站 |
关于站长 |
如何完成一部教程 |
公众号 |
联系我们 |
网站地图
Copyright ©2012-2022 biancheng.net, 冀ICP备2022013920号, 冀公网安备13110202001352号
加入微信交流群,一起学习不枯燥。内含一款搜索神器,免费下载全网书籍和视频。