掌握了Go语言的朋友应该知道,在Go的结构体类型声明中,字段声明后可以跟一个可选的字符串标签。typeUserstruct{Namestring`json:"name"`}上面是一个标准的例子。标签json:"name"xml:"name"在Name字段声明中指定。这个标记值看起来有点类似于在Java程序中为类属性添加类属性。注释。那么这些结构标签有什么用呢?可以随便写吗?我们日常工作中常用的结构标签有哪些?我们可以自己定义结构标签吗?今天小编就带大家搞清楚这些问题!StructureTagsGo语言允许我们将“元信息”附加到一个字段上,该字段可以通过structure字段标签反射获取。正如我们上一篇文章演示了Go反射的使用和应用场景,我们讲了Go语言反射的使用,如果你对反射不清楚,可以先复习一下。通常,结构标签用于提供有关结构字段如何编码为另一种格式或从另一种格式解码(或保存到数据库/从数据库中检索)的转换信息。但是,您也可以使用它来存储您想要设置的任何“元信息”,供其他包使用或供您自己使用。使用规范结构标签的使用通常遵循以下三个规范。structurelabelstring的值是一列以空格分隔的key:"value"对,例如:typeUserstruct{Namestring`json:"name"xml:"name"`}key,通常表示那个“值”下面是使用的是哪个包,比如keyjson会被encoding/json包处理。如果要在“key”对应的“value”中传递多个信息,通常用逗号(',')分隔指定,如Namestring`json:"name,omitempty"`按照约定,如果afieldstructuretag中某个key的“value”设置为破折号('-'),意思是告诉处理该结构体tagkeyvalue的进程排除该字段。例如,设置一个字段的标签为如下的Namestring`json:"-"`表示在对JSON进行编码/解码时忽略Name字段。如何获取结构体标签一开始我们说了结构体标签是为反射准备的,那么在Go程序中如何使用反射来获取字段的结构体标签呢?看过我们上一篇文章的同学应该知道,在反射世界中,与结构体字段类型相关的信息是由reflect.StructFiled类型来表示的。typeStructFieldstruct{NamestringTypeType//fieldtypeTagStructTag//fieldtagstring……}如上图,其中包含的Tag字段代表字段声明中的结构标签信息。下面我们以自定义结构体标签为例,演示如何使用它在反射中读取标签中的信息。使用反射获取自定义结构体标签使用反射反射包访问结构体字段的标签值,我们需要先获取结构体的类型信息Type,然后使用Type.Field(iint)或Type.FieldByName(namestring),查询字段信息的方法,这两个方法都会返回一个StructField类型的值,我们上面也说过,它是用来描述反射世界中的一个结构体字段;而StructField.Tag是一个StructTag类型的值,它描述了字段的标签。上面我们讲了结构体标签的使用规范。如果你按照规范为字段设置了tag,你可以使用StructTag的Get方法解析tag的值,返回你指定的key的“值”。func(tagStructTag)Get(keystring)string为了方便判断给定的key是否存在于tag中,StructTag还提供了一个Lookup方法func(tagStructTag)Lookup(keystring)(valuestring,okbool)不同于Get方法,Lookup会通过返回的ok值判断给定的key是否存在于标签中。下面用一个例子来演示一下我们获取自定义标签的过程。packagemainimport("fmt""reflect")typeUserstruct{Namestring`mytag:"MyName"`Emailstring`mytag:"MyEmail"`}funcmain(){u:=User{"Bob","bob@mycompany.com"}t:=reflect.TypeOf(u)fori:=0;i
