Go语言结构体标签(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 时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,参见下面这个例子:
代码输出空字符串,并不会输出期望的 type。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"))
}
}
第 12 行中,在
json:和"type"之间增加了一个空格。这种写法没有遵守结构体标签的规则,因此无法通过 Tag.Get 获取到正确的 json 对应的值。这个错误在开发中非常容易被疏忽,造成难以察觉的错误。
- 随机文章
- 迈 马尔代夫(马尔代夫再次开放,恢复旅游业)
- 北京-马尔代夫机票(北京至马尔代夫往返机票预订现在开始!)
- 蜜月 日本 马尔代夫(赏心悦目的蜜月之旅:日本和马尔代夫)
- 中国 马尔代夫 时差(马尔代夫与中国的时差是多少?)
- 出境前往马尔代夫(出国踏浪,马尔代夫水上乐园等你来!)
- 找马尔代夫的感觉(浪漫马尔代夫:天堂般的热带度假胜地)
- 南京 马尔代夫 游记(南京小姐姐远赴蓝天碧海,畅游马尔代夫诸岛)
- 龙虾 马尔代夫(后的新:马尔代夫龙虾大闹美食界)
- 咸阳 马尔代夫(咸阳居民赢得马尔代夫梦想之旅)
- 写乐 马尔代夫(探访印度洋最美天堂:马尔代夫)
- 沐阳马尔代夫视频(沐阳分享马尔代夫度假视频,美不胜收)
- 沙堆心中马尔代夫(沙堆的珊瑚海之旅:马尔代夫岛国探秘)
- 江宁马尔代夫图片(江宁水清沙白!领略马尔代夫养眼照片)
- 恒大 马尔代夫(恒大集团在马尔代夫扩大投资规模)
- 此生必去马尔代夫(探秘马尔代夫:体验此生必去的天堂!)
- 马尔代夫作息时间(马尔代夫时间表:体验度假胜地的一天 小:马尔代夫作息时间)
- 迪拜马尔代夫对比(迪拜和马尔代夫:一场度假胜地的对决)
- 海南马尔代夫度假(海南有一个像马尔代夫一样的度假胜地)
- 越南东方马尔代夫(越南“东方海上度假胜地”:旅游新宠)
- 疫情没去马尔代夫(马尔代夫:未受疫情影响,值得前往!)
- 雪后马尔代夫济宁(雪后马尔代夫岛上美景曝光,引人入胜)
- 杨波 马尔代夫(杨波在马尔代夫发现新物种,震惊科学界!)
- 简阳马尔代夫洪水(简阳马尔代夫遭遇洪水,请转告关切!)
- 马尔代夫今日行情(马尔代夫当日行情:最新价格和变化。)
- 韩国马尔代夫旅游(韩国游客喜爱的度假胜地——马尔代夫)
- 旅游 马尔代夫(探索马尔代夫:天堂岛国的完美度假体验)
- 马尔代夫出国口语(如何在马尔代夫提高你的英语口语技能)
- 马尔代夫出圈照片(马尔代夫炫酷照片火了,网友惊叹不已)
- 马尔代夫偶遇之旅(旅行者惊喜“闯入”马尔代夫私人岛屿)
- 马尔代夫吃饭视频(马尔代夫美食视频:探寻当地饮食文化)
