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方法。
·下边copy一下实例给大家演示一下。下边首先上边是定义了一个结构体,person里边有name、age、email以及birthday。接下来就是实例化结构体,下边通过反射机制tap off获得结构体类型。
·接下来下边类型里边有一个叫number feel的,就是这里边有几个字段,这里边一共有四个字段,相当于是循环了四次。每一个字段里边看t点feel的每个字段,拿到了之后这里边又有tag属性里边有get方法。
·这时就取到了这个tag,如果是g、o、m就取到了这个。下边来运行一下看效果。运行之后把每个字段的名称取到了这个地方,就是feel的s代表的是每个字段的名称。看一下feel的点内幕,另外上边这个地方取到了jason tag的内幕还有gom tag的内幕,然后输出。
这是解决了一个问题,就是这些tag是怎么样来解析的?怎么说白了就是怎么样用。这些tag写好了之后怎么样取到这些值?是通过反射机制来实现的。
还有就是看一下假如这阵想使用财神解析,这些都影响到哪些内容?把这个例子copy一下,翻过来,上边tag写的是zation,这里边写了一个name,运行一下。这个例子就是这有个结构体,下边是实例化,实例化完了之后通过把结构体编码成了z成这样一个格式,运行输出。
会看到这里边内幕是这种格式,影响的哪些地方?比如内幕改成内幕一,这个也改成a之一,改成一面五一再来运行。现在会对比一下发现下边的这些c枕里边的这些填前边的名称都变化了,这个是更上贼声里边对应的,也就说到底是用在什么地方,要知道为什么写的这个地方是怎么来使用的。
有关高浪里边的结构体里边的tag大概掌握这么多就差不多了,第一个要知道它是干什么用的。
·第二个要知道怎么样来使用。
·第三个要知道影响到哪些地方。