Golang专栏/Golang高频问题汇总/golang在参数和返回值中使用指针和值有什么区别?
再来看一下Golang里边的另外一个高频问题,这个问题是Golang结构体里边的tag是如何使用的?
首先看一个实例,当写个结构体的时候后边经常有一些翻译号里边有一些标记,这个称作为tag标记,这些标记干什么用的?它主要是一些额外信息,就是一些额外的原数据信息,比如要做数据的序列化或者反序列化,或者是bm,也就是对象关系映射或者其他的一些验证信息都会放到这里边。
给大家举个例子,打开vscod,就这样先创建一个主包和主程序。接下来来创建个结构体tys,假如要person,然后有个id,这有int类型的,后边经常会写一个繁衍号里边。假如写一个jason,假如写一个xml,xrml或者是cm,这些都是。
这个jj像jrm这些都叫tag标记,叫什么?这个叫tag标记。首先要了解的是这些tag标记都是干什么来用的,其次就是要知道这些tag标记是如何解析的。
接下来再来看一下怎么样来使用,下边有一个例子,这里边有jj,像gom或者是validate验证等等,就是有一系列这些tag能下边来看一下怎么样来使用。
常见的一些tag有哪些?比如zechin序列化或者反着序列化的,这里边有zechin后边有个字段,后边还有一些,比如编码的时候如果是零值可以忽略掉等等,这个代表的是jason反系列化,忽略这个字段就是这个字段不做系列化或者反系列化等等。
还有一些就是om框架里边,比如gom或者是xom里边的一些om这些tag,除了这个之外还有一些像veldet验证,验证是否为空,长度等等。还有一些spagher里边的文档生成列表可以使用tag,还有一些像protocobuffer的一些系列化的时候也可以使用tag,看到没有?
以及grm等等,下边要解决的问题就是这些tag是怎么样来解析的?当使用这些tag的时候一般情况下不是直接来解析,比如使用栽省解析的时候会有专门的解析,它的原理其实通过反射,这里边有个反射机制reflect,比如下边有个person,这里边有一些tag有声音,有这个就要慢。
接下来怎么样实现?
·拿到这些tag标记,首先通过reflect这些反射的机制,拿到它的类型。接下来类型里边有字段的数量,每个字段里边有当前字段,子弹下边又有一些标记,比如tag,tag里边有一些get、set方法。