00:00
我们来看一下结构体的最后一个需要同学们注意的一个细节,就这在结构体的每个字段上,我们还可以写一个标签叫T,这个标签呢同可以通过反射机制来获取,当然了,有同学说老师反射机制我们还没有讲,是的,反射机制现在还没讲,后面我们会说的,这里呢,我们就说体验一下啊体验一下,那这个反射机制常见的使用机制,它它是用来做什么呢?它是用来做序列化。序列化和反序列化的,你比如说你比如说我们有些时候这个monster它是一个,比如它是个结构体,那么这个结构体大家看到有这么一个需求,需要大家去思考,比如说这个结构体,我们这个名字大家都知道,这个名字是大写的N,就是name,是不是它首字母是大写的N呢?大家知道我们为什么要把它写成大写的N吗?就是因为我们有些时候是需要这个,呃,这个monster的变量,这个monster结构体的变量能够在其他的包去使用,对不对,是这样子的吧,但是有一个问题,但是有一个问题就是说因为这个。
01:15
变量它的首字母大写呢,有些程序员它是不方不习惯的,比如说打个比方,这里是我们的服务器,比如这是我们的一个go服务器,那么go服务器这一头呢,大家注意观察这地方,比如说是我们的IE浏览器,注意听啊,就是IE浏览器,那么当IE浏览器发一个信息给我们go这个服务器过后呢,Go它往往会去操作一个数据库,比如说这数据库啊,他去操作数据库,然后操作完了过后呢,它会返回一个数据给我们的IE。或者是浏览器吧,这不一定叫IE浏览器,就叫浏览器。或者叫一个客户端都可以,那么这个时候就存在一个问题,就说我们假设这个go,它会返回一个结构体变量,追听它要返回一个结构体变量,注意听啊结构体变量,那么我把这个具体变量返回给客户端的时候,我怎么返回?
02:09
我不可能把一个结构体本身直接返回,往往是把这个结构体做成一个字符串。是不是把它做成一个字符串啊?或者痔疮。那么问题就来了,既然你要把它做成一个字串,那就意味着你要把结构体先序列化。序列化的概念就是把可以把一个变量。序列,序列化成一个字符串,然后再返回去。返回给你的客户端,这样子就是一种标准,那么一般来讲这种字符串有一个现在通用的一种格式叫杰森。能理解吗?有接森好这种接呢,往往来说别人返回这个字段呢,他并不希望是一个大写的N。它并不写,因为很多这个客户端他更喜欢的是返回这个字段名呢,是小写的N好,这时我们就可以给我们的这个结构体加一个tag,加上一个tag以后呢,这个时候诶,然后你就可以在这指定一个小写的字段叫name,好当你写成一个小写的name过后,诶,对方拿到这个名字过后,他就非常习惯。
03:21
因为它既可以在别的包去访问你的字段,同时还可以处理,还可以把你的字段名改成他希望的字段名字。可能我这样讲哈,同学们并不知道为什么,那么大家看我的这里写的啊,来说明一下问题,当杰森除以完后,字段名首字母也是大写这样,如果我们是将节省后的字段返回给其他程序使用,比如像j query PHP这样的客户端,那么就有可能他们不习惯这种命名方式,怎么办?解决的方法是这样子的,这里就是给monster这个结构体的字段的首字母大写小写,这个是行不通的,因为你小写,如果你小写的话,别的包用不了,对吧?你会发现处理后返回的是空串。
04:10
对吧,因为Jason Mar这个这个JA省就是用来做把这个结构体转成一个字符串的啊,那么其他包用不了,首先首字母小写呢,就不可能在其他包访问,这时我们的解决方案就是T,好,多说无益,我说了半天可能大家也不知道老师在说什么,我就举个例子,注意听啊,现在举个例子给大家说一下这个。这个标签会有什么用处?因为这个structure structure呢,这个结构体,每个字段上就可以用这个标签,来我们看看标签的用处,这是个很重要的细节,大家注意听讲。好到每个字段上可以写个tag。写个tag tag可以通过反射机制,常见的场景就是序列化和反序列化。主要是序列化用的多,那么我来举个例子说明一下啊。可能有些同学第一次听,还不知道老师在说什么事情,我先把这个案例给大家提出来来。
05:06
我就在这儿讲。现在假设我们有这么一个需求,注意听讲说我这有一个type,有个monster结构体。这个master里面呢,有什么字段呢,有名字。好,没问题吧,有名字有年龄有年龄int好还有一个什么呢?还有一个skill,他的这个他的最厉害的武器,或者最厉害的这个攻攻击技能是什么叫scale,好,现在呢,我有这么一个需求,我希望我我先第一步啊,先创建注意听讲啊,先创建一个monster这个变量。这个没问题吧,Monster轴等于什么呢?我做一个。好把它定下来,比如说第一个,他的名字叫牛魔王。牛魔王没问题,好,紧接着呢,我他的年龄,我给他一个500岁。
06:04
再来他的这个最厉害的武器是什么呢?好,他是。牛头拳啊,或者叫这个芭蕉扇,芭蕉扇啊,这是他最厉害的。芭蕉扇好,这就写完了,那写完过后呢,我们。刚才老师画那个示意图还记得吧?就是这个图,如果大家忘了的话,我我四个亿啊,我四个亿啊,有些照顾一下基础比较弱的同学,比如说我现在有这么一个需求,这是一个客户端。明白客户端呢,有了我这边呢,还有一个叫服务器端。OK,这个服务器端。服务器端服务器端假设这边就是我们的购物语言写的。好,现在呢,客户端向我们发出了一个请求。发出了一个请求。好,发出一个请求,过后呢,Go语言给他回送了一个信息。就这么简单一个事情,那么假设我这个购物语言要返回一个什么数据给这个客户端呢?假设啊,假设假设,我说假设假设。
07:11
好,假设这个服务器就是这边要返回。返回一个什么呢?Monster这个变量的值。有这种可能性吧,你比如说我将来这个客户端是一个浏览器,我就要浏览一下你当前服务器里面有多少个monster变量,或者这个我我要进行一个查阅,或者看看这个monster的信息,或者看学生信息,都有可能吗?假设是个浏览器。好,这个时候你就要返回这个它的变量,可能是一组变量啊,我要说是一个是简化了,可能更多的情况下是返回,返回这个一组这个monster或者是学生信息,那么这个时候你不可能把这个变量直接返回去,通常情况下是把这个mon,怎么样呢?把这个monster序列化。序列化,其实序列化就是一个字符串。然后再把这个序列化的字符串返回给我们这个客户端,那么客户端拿到这个东西干什么呢?客户端接收到。
08:09
他接收到了啊,接收到这个monster的这个字符串后,字符串后就可以进行处理了。诶,他拿到这个字符串,它就可以进行处理嘛,然后他下一步就是进行处理。进行处理,OK。好,现在的问题是,我们怎么把一个monster,把它做成一个字符串呢?通常情况下,序列化,序列化其实就是序列化一个节省节省格式。好,嗯,关于这一点啊,同学们关于序列化和这个解释呢,我会还会后面还会讲,但是这地方我必须要说明一下,为什么这个地方就讲呢?因为这里面涉及到一个问题,就是结构体怎么把它序列化。这时我们需求就这样子的啊,现在呢,一般是这样做的啊,同学们,你你们先看我把来给你们演示一下怎么做呢,他有个专门的一个包包。
09:06
他有这么一个包,叫机身包。好,我们打开我们的这个地方,我们看一下,大家看一下go。Go,官方。文档,好,我们先弄一页,同学们,我打开它注意看啊。我们找到这里面有个包叫杰森包。杰森。再往下看节啊,我自己搜一下也可以啊,节省。杰森宝。好,找到了encoding encoding Jason,那么encoding Jason里面呢,大家可以看到,这里面就有一个方法叫Mar。往下往下走这个muscle。大家看这这里面。这个muscle函数,它会返回你传进去的一个变量的这个节省编码。好,我们先来用一用啊,那既然我们要引入这个班,那肯定是这个n Co这个。
10:02
我们就把它写进去了,好吧。先你这个包包。好。你这个包过后呢。引入这个包过后,好,我们接着往下,诶这一方。可能要这么写对吧,要这么写就没问题了。好,他说这个地方online Spain啊,我们先看这地方是什么原因。哦,他说我们这个没有用过是吧,没有用过,好这个方向是没说的,我们先来用一下。注意听将什么呢?将这个master这个变量序列化。序列化,为什么呢?一个字串。这个字串就是节省格式的字串。这样写啊,字序列化成杰森。格式的对不对,这样大家是不是就听懂了字符串。止损。好,那么怎么来把它序列化呢?非常简单,它是这样子的啊,同学们听我说,它使用的就是这个杰森这个包包里面的一个方法叫Mar。
11:07
好,然后我们把这个对象传进去。那传进去过后呢,它会返回一个字符串,比如说我们就叫这个啊,叫G格式的master。好,我简简单写一下啊。写完了。好,那这个时候我输出一下,你们看一下效果。最听讲好,这时我们输出一下杰森,它的内容是什么?节省字串吧,这样简简单这样写一下,好吧,节省十寸,那么我们把它输出来过后,大家一看就傻眼了,为什么傻眼了呢?跟你想象的不一样。我们想象的。啊,他说这个地方single to。哦,这地方咱们用的时候还要注意一下啊,注意它的一个细节,注意它的细,注意一个什么细节呢?就是这个方法,这个方法它其实会返回两个值。
12:04
大家看一下,它一个是返回一个BAT字节,另外还error,如果你不想接收error的话呢,其实这地方我们还要做一个动作,这样子才行。对吧,如果你不想接收,那你就。忽略,但是实际上呢,有时候我们往往还是要看一下的,因此呢,这样做啊,我们把这个信息做一下,我们做一个判断,如果A。怎么样,不等于空?不等于空。是吧,不等于near,我们就输出一句话,就是什么呢,错误。就是序列化,就是接词。我们就直接写计时。杰森处理错误,怎么错误呢?把信息给打出来就可以了,否则的话我们就把这个结果输出来,对吧,叫杰森证。好,那么我们来执行一下这个效果CD,我们go。够让命点,够没问题吧,我们跑起来,我们发现。
13:02
大家看到。你看这地方信息跟我们想的不一样吧,是吧,你看。是这样的一个信息,那这个信息为什么没有正确输出呢?大家想一想,是不是它返回的是一个什么东西,什么什么东西,大家想想是不是它返回的是一个。自己呀。他是不是返回一个切片,是一个bit这样一个切片,那你怎么样把它给我转成一个字符串,可以看到的呢?还记不记得这个方法,我们前面是不是讲过这个东西还记得吧。是不是在这里我们只需要非常简单的用这个试卷给它转一下就可以了,是不是好,我们把它打印出来看一下。招,跑起来。我们可以看到此时此刻他的的确确就返回了一个字符串。但是大家看。这个就是它的字符串哦,你看到这里面这个字段是不是大写的N。是不是大写的,这边也是大写的A,这边是大写的S,但是很多程序员刚才我讲过了,很多程序员他并不习惯你的这个。
14:10
这个字段的首字母是大写的,因此我们解决方案呢有两种,第一种方式把它改成小写的。那你看看改成小写的会怎么样呢?好,当我们改成小写过后,注意听讲,再一执行,我们傻了眼了,我们发现返回这个空串好怪啊。诶,我问同学们思考,我问同学们想一想你们,你们想为什么他是分空串啊。为什么是空串,是不是因为你用这个杰森这个包去掉了他的master,这个方法相当于是在别的包,因为这个杰森是他在另外一个包包里面,是不是这个意思啊,他在另外一个包里面,那你相当于是说你在别的包里面用到这个master的变量了。是这意思吗?但是你的monster变量的字段又是什么呀?又是小写的,那就根据我们作用域前面讲的作用域的原则,那你在这个Jason这个方法里边是使用不到或者访问不到这个name age和scale的。
15:08
因此,你只能大写。不然的话,别人用不了,别人无法给你序列化,但是问题又来了,它序列化过后,它的字母是大写的,怎么办呢?好了,现在终于引出我们结构体的这个tag了,非常简单,你只要这样做就行了。一个这个反引号,注意是反引号啊,反引号完了过后呢,写上你的这个字段名,比如说咱们把字段名给他写一下。比如说name。走,然后把你的值写进去,比如说我们这样写的啊,Jason。接冒号,然双引号,好,我要写成小写内,这样就可以了,在同样的道理下边一样的修改。前面这个节省接节省这个名字固定的啊,然后改成H去听,这个在我们实际开发中用的可以说是非常非常的多的啊,只是反原理我还没有讲。
16:03
原理呢,到反思的时候我们再说好不好?好,同学们,当我这样一改动过后,我们再来一执行,请看效果。我们发现。跟我们想象的完全一样,大家看这里,诶,原先你的是。这个名字我现在小写的,你是age age skill skill,好,这样呢,我既能够序列化,同时我能把这个反序列化的支付串通过网络返回给客户端,客户端的人呢,他也很习惯这种用法。因为一般的程序员他就喜欢这种首字母小写的对吧,好,这样就能保持一种兼容性,好,这就是我们的这个东西,就是他。注意听这个就是他。就是T。注意啊,我写到这里。后面这这一部分。就这个部分就是结构体的标签。就是什么呢。就是啊,就听。
17:01
就是。Tag。理解好,就这么简单,那我我已经讲过了啊,嗯,至于它底层就是这个Mar这个函数,怎么样就能够把你的这个名字的这个大写的这个,嗯,这个名字换成了这里面的名字呢,这个里面用到了反射。因为反射我们现在还没讲,所以说现在老师只能先。放在这个地方啊,这里底层里面就是我们接点Mar。Marsh。Al函数中函数中啊,函数中使用到反射了。反射这个我们后面会详细介绍反射,讲反射史这个讲解。讲解反射时。我会详细介绍。我会详细啊,详细介绍,注意听我会详细介绍这个大家注意看一下啊好。
18:03
嗯,那现在呢,这个就是我们tag的一个用使用的案例,大家体验一下好吧,体验一下OK,我把它给同学们板述一下。阐述一下,就首先我说了下为什么需要序列化。是不是相当于这个地方是讲的为什么需要序列化这个这个应用场景对不对,尽管有些同学不知道为什么要这么做,但是呢,我已经把这个场景给大家抛出来了,好,这个场景呢,我也把它写进去,就是为什么需要序列化。好,引出这个问题的。一个使用场景。序列化。序列化的使用场景。没问题吧,同学们。好,我给大家来一个板书。OK,然后呢,下边呢,就是我们具体的代码案例演示。这点我们再来一个板书。没问题,好,我把它整理到我们的笔记里边去。
19:00
好,刚才那个核心代码就是这个这个代码一个我们定义了一个monster的结构体。没问题吧,放在这里。好搁这,然后呢,我们针对这个monster结构体呢,我们做了一个序列化的处理,我们把核心代码也给大家拿到这里来看一看。是不是这一段啊,第23行到下面这一行。OK。把它也放好。好,这个就是我们讲的这块内容啊,到此呢,我们结构体里边的四个细节和注意事项就全部给大家讲完了。后面呢,我们再接着讲这个结构体其他内容。那关于这块。结构体的细节,我们就给大家介绍到这里。
我来说两句